Sitefinity 4.0 Beta running on Azure, now!
Hi all
Couldn't sleep last night so thought I would see how the current Beta got on with Azure. Turns out it seems to work fine already, have a look! :)
http://sitefinity.cloudapp.net
I just created a couple of pages. /home and /test and wrote a tiny widget to get the instance of the Web Role that handled the request. So you can see which instance generated the page, there are currently 2 Web Roles running.
As you can see the whole interface is there too :)
http://sitefinity.cloudapp.net/Sitefinity
I will leave it running for a couple of days while I do some testing and anything else I can think of at this early stage.
It ran fine in the development fabric as well so all looks good. The admin interface doesn't seem to mind being load balanced without any configuration and is clearly not using any session state as you can get subsequent requests handled by different instances, cool!
The DB also migrated to SQL Azure without any errors, well done Telerik.
It went a little slowly to start with but I then realised I had put the DB in W Europe and the App in N Europe!! Once I located them together it goes very quickly I think. I am just running 2 small instances for the Web Role. Admin site runs quickly too.
I haven't found anything that doesn't work yet, would appreciate the guidance of the Sitefinity team on what to try..? I would like to write a logging provider so the SF logs can be transferred to Azure storage along with the other diagnostics. Hopefully we can have an image manager provider to store images/videos/docs on Azure Storage which we can then push out to the CDN to speed things up further.
What next, I want to develop this, I think SF on Azure is going to be great.
Matt
First off, wow! Great job. This was on our "to do" lists but you beat us to the punch. (Thanks for making us look bad.) (Just kidding.) :)
Hi Gabe
update:
Just noticed the Analytics data seems to have vanished, still data on Google but none on Siefinity..
M
I'm getting an error when I launch http://sitefinity.cloudapp.net
Did you unload?
Hi Krishna
No it's still there, I think these errors are caused by a mismatch in what ORM is expecting and what Azure SQL is doing.
Azure will actively close connections that are not being used and I think ORM is expecting them still to be open and trying to use them, hence getting this error.
I remember something in the ORM documentation about a flag to get it to check connections are still open before it uses them.... I'm looking for it now :)
Matt
UPDATE:
I believe it just needs this changing in the ORM backend config:
<backendconfiguration id="azureConfiguration" backend="azure"> <lockTimeout>5000</lockTimeout> <testOnAlloc>True</testOnAlloc> <mappingname>azureMapping</mappingname></backendconfiguration>Hi all
I've temporarily taken the app down while I get ORM singing sweetly with SQL Azure. It would work fine most of the time but then would cause a few errors with these closed connections.
Stay tuned :)
Matt
Have you any details on pricing that the installation and running costs will incurr in comparison to hosting on a provider such as DiscountAsp.Net.
Regards,
Neil
Hello,
Matthew, your initiative is just great. My regards about this. The experience you share is certainly very helpful and we are all happy because of the results.
Please keep us posted, and cheers from the team.
Hi nenwmn
Hi mattc,
Really appretiate the response given and some excellent pointers to those not familiar with Azure, your experience has already helped me.
Best Regards,
Neil
I also feel that Azure would be a very valuable 'first level' supported deployment target for SiteFinity 4. To that end, I will also offer my development time to help make that happen.
I use Telerik products extensively, especially the ORM and WPF libraries, and I think that we could suggest targeted changes to the distribution to support cloud deployment.
For example, I have often thought that reliance on App_Data was a bad idea for configuration settings. It seems that there should be a true/false toggle in the web.config to store these types of settings in the database (the default) or in App_Data.
In addition, when it comes to the database, I would prefer that you support the option to store all image media in a separate database anyway. Even for local installs, I believe it is better to store that larger BLOB stuff in a separate database. Ideally, I would also hope to have an option to store image media in a file system, with a reference to the path in the database (using smart 3rd normal form structure for directory and file so that a given media element only has a single integer foreign key i.e. File_ID). I've coded this kind of structure before several times, and it is not that hard. The nice thing is that it makes it easier for customers who use shared hosting where file system space is generous (and cheap) -- which is the norm -- to take advantage of that.
To drive this point home, I have 2 TB of image and video files that I'd like to index in SiteFinity 4. That covers more than 500 directories and about 100,000 files. I'd like to retain the file structure in the database, because the hierarchical paths mean something about what the media is and from when. If I wrote an import script to call the SiteFinity API, I would also use that structure to affect things like tags and categories.
Anyway, I will strive to duplicate Matt's Azure installation and contribute to the process.
Hi Brian
Here's one more big fan of cloud services.
And from a business perspective, I can only give two strong recommendations
- provide a "ready to fly" Sitefinity environment on WindowsAzure
- give new users/clients a chance to
- easily create a "website"
- link a domain to it (comparably like BPOS handles that with the hosted Exchange services)
- provide a consumption pricing with different service levels.
Third :)
If you are not looking at this as an option, let's take Matt and our team and Microsoft to the next round table and get this started as a partner offering. that you can back through a dynamic pricing (1 ct per served page ?)
Kind regards,
Markus
Hello Mattc,
Hi Maciej
I created a new cloud solution and then imported all the files from a Sitefinity installation to the Web Role, rather than trying to make the Sitefinity project into an Azure app.
Here is the web.config. Most of it comes from Sitefinity obviously.
I have been very busy but will post a walkthrough of how to create the solution from scratch shortly.
Matt
<?xml version="1.0"?><!-- Note: As an alternative to hand editing this file you can use the web admin tool to configure settings for your application. Use the Website->Asp.Net Configuration option in Visual Studio. A full list of settings and comments can be found in machine.config.comments usually located in \Windows\Microsoft.Net\Framework\v2.x\Config --><configuration> <configSections> <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/> <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> </sectionGroup> </sectionGroup> </sectionGroup> </configSections> <appSettings/> <!-- Set your mail settings here --> <!--<system.net> <mailSettings> <smtp from=""> <network host="" userName="" password="" port="" /> </smtp> </mailSettings> </system.net>--> <system.diagnostics> <trace> <listeners> <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics"> <filter type="" /> </add> </listeners> </trace> </system.diagnostics> <system.web> <siteMap defaultProvider="SitefinitySiteMap"> <providers> <add name="SitefinitySiteMap" type="Telerik.Sitefinity.Web.SitefinitySiteMap, Telerik.Sitefinity" taxonomyProvider="OpenAccessDataProvider" pageTaxonomy="Pages" rootNode="FrontendSiteMap" pageProvider="OpenAccessDataProvider"/> </providers> </siteMap> <membership defaultProvider="Default"> <providers> <clear/> <!--<add name="FrontendUsers" type="Telerik.Sitefinity.Security.Data.SitefinityMembershipProvider, Telerik.Sitefinity"/>--> <add name="Default" type="Telerik.Sitefinity.Security.Data.SitefinityMembershipProvider, Telerik.Sitefinity"/> </providers> </membership> <globalization uiCulture="auto" culture="auto" resourceProviderFactoryType="Telerik.Sitefinity.Localization.ExtendedResourceProviderFactory, Telerik.Sitefinity"/> <!-- Set compilation debug="true" to insert debugging symbols into the compiled page. Because this affects performance, set this value to true only during development. --> <compilation debug="true"> <assemblies> <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> </assemblies> <buildProviders> <remove extension=".svc"/> <add extension=".svc" type="System.ServiceModel.Activation.ServiceBuildProvider, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> </buildProviders> </compilation> <!-- The <authentication> section enables configuration of the security authentication mode used by ASP.NET to identify an incoming user. --> <authentication mode="Forms"/> <customErrors mode="Off"></customErrors> <!-- The <customErrors> section enables configuration of what to do if/when an unhandled error occurs during the execution of a request. Specifically, it enables developers to configure html error pages to be displayed in place of a error stack trace. <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> <error statusCode="403" redirect="NoAccess.htm" /> <error statusCode="404" redirect="FileNotFound.htm" /> </customErrors> --> <pages> <controls> <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add tagPrefix="telerik" namespace="Telerik.Web.UI" assembly="Telerik.Web.UI"/> </controls> </pages> <httpHandlers> <remove verb="*" path="*.asmx"/> <add verb="*" validate="false" path="Telerik.Web.UI.SpellCheckHandler.axd" type="Telerik.Web.UI.SpellCheckHandler, Telerik.Web.UI"/> <add verb="*" path="Telerik.RadUploadProgressHandler.ashx" type="Telerik.Web.UI.Upload.RadUploadProgressHandler, Telerik.Web.UI"/> <add verb="*" path="Telerik.Sitefinity.FilesDownloadHandler.ashx" type="Telerik.Sitefinity.Modules.Files.FilesDownloadHandler, Telerik.Sitefinity"/> <add verb="*" path="Telerik.Sitefinity.LibrariesRadUploadHandler.ashx" type="Telerik.Sitefinity.Modules.Libraries.Web.LibrariesRadUploadHandler, Telerik.Sitefinity"/> <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/> <add verb="*" path="*.svc" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <add verb="*" validate="false" path="Telerik.Web.UI.DialogHandler.axd" type="Telerik.Web.UI.DialogHandler, Telerik.Web.UI"/> <add verb="*" path="Telerik.Sitefinity.AsyncImageUploadHandler.ashx" type="Telerik.Sitefinity.Modules.Libraries.Web.AsyncImageUploadHandler, Telerik.Sitefinity"/> </httpHandlers> <httpModules> <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add name="Sitefinity" type="Telerik.Sitefinity.Web.SitefinityHttpModuleIIS6, Telerik.Sitefinity"/> <add name="RadUploadModule" type="Telerik.Web.UI.RadUploadHttpModule, Telerik.Web.UI"/> <add name="SitefinityAnalyticsModule" type="Telerik.Sitefinity.Analytics.Server.DependencyResolution.Module.DependencyRegistrarHttpModule, Telerik.Sitefinity.Analytics.Server.DependencyResolution"/> </httpModules> </system.web> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="basicHttpBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"> <security mode="None" /> </binding> </basicHttpBinding> </bindings> <behaviors> <endpointBehaviors> <behavior name="SitefinityWebApp.Sitefinity.Services.Content.EventsAspNetAjaxBehavior"> <enableWebScript/> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="Telerik.Sitefinity.Analytics.Infrastructure.Services.AnalyticsPermissionsServiceBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> <behavior name="Telerik.Sitefinity.Analytics.Server.GoogleAnalyticsPlugin.Services.AccountsServiceBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> <behavior name="Telerik.Sitefinity.Analytics.Infrastructure.Services.DashboardDataBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> <behavior name="Telerik.Sitefinity.Analytics.Infrastructure.Services.MapDataServiceBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <services> <service name="SitefinityWebApp.Sitefinity.Services.Content.Events"> <endpoint address="" behaviorConfiguration="SitefinityWebApp.Sitefinity.Services.Content.EventsAspNetAjaxBehavior" binding="webHttpBinding" contract="SitefinityWebApp.Sitefinity.Services.Content.Events"/> </service> <service behaviorConfiguration="Telerik.Sitefinity.Analytics.Infrastructure.Services.AnalyticsPermissionsServiceBehavior" name="Telerik.Sitefinity.Analytics.Infrastructure.Services.AnalyticsPermissionsService"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" contract="Telerik.Sitefinity.Analytics.Infrastructure.Services.AnalyticsPermissionsService" /> </service> <service behaviorConfiguration="Telerik.Sitefinity.Analytics.Server.GoogleAnalyticsPlugin.Services.AccountsServiceBehavior" name="Telerik.Sitefinity.Analytics.Server.GoogleAnalyticsPlugin.Services.AccountsService"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" contract="Telerik.Sitefinity.Analytics.Server.GoogleAnalyticsPlugin.Services.AccountsService" /> </service> <service behaviorConfiguration="Telerik.Sitefinity.Analytics.Infrastructure.Services.DashboardDataBehavior" name="Telerik.Sitefinity.Analytics.Infrastructure.Services.DashboardData"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" contract="Telerik.Sitefinity.Analytics.Infrastructure.Services.DashboardData" /> </service> <service behaviorConfiguration="Telerik.Sitefinity.Analytics.Infrastructure.Services.MapDataServiceBehavior" name="Telerik.Sitefinity.Analytics.Infrastructure.Services.MapDataService"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" contract="Telerik.Sitefinity.Analytics.Infrastructure.Services.MapDataService" /> </service> </services> <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> </system.serviceModel> <system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <providerOption name="CompilerVersion" value="v3.5"/> <providerOption name="WarnAsError" value="false"/> </compiler> <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" warningLevel="4" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <providerOption name="CompilerVersion" value="v3.5"/> <providerOption name="OptionInfer" value="true"/> <providerOption name="WarnAsError" value="false"/> </compiler> </compilers> </system.codedom> <!-- The system.webServer section is required for running ASP.NET AJAX under Internet Information Services 7.0. It is not necessary for previous version of IIS. --> <system.webServer> <validation validateIntegratedModeConfiguration="false"/> <modules> <remove name="UrlRoutingModule"/> <remove name="ScriptModule"/> <remove name="RadUploadModule"/> <remove name="Sitefinity"/> <remove name="SitefinityAnalyticsModule"/> <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add name="Sitefinity" type="Telerik.Sitefinity.Web.SitefinityHttpModule, Telerik.Sitefinity"/> <add name="RadUploadModule" type="Telerik.Web.UI.RadUploadHttpModule, Telerik.Web.UI"/> <add name="SitefinityAnalyticsModule" type="Telerik.Sitefinity.Analytics.Server.DependencyResolution.Module.DependencyRegistrarHttpModule, Telerik.Sitefinity.Analytics.Server.DependencyResolution"/> </modules> <handlers> <remove name="ScriptHandlerFactory"/> <remove name="ScriptHandlerFactoryAppServices"/> <remove name="ScriptResource"/> <remove name="UrlRoutingHandler"/> <remove name="WcfHandler"/> <remove name="WildCard"/> <remove name="Telerik.Web.UI.DialogHandler"/> <remove name="Telerik.RadUploadProgressHandler"/> <remove name="Telerik.Sitefinity.FilesDownloadHandler"/> <remove name="Telerik.Sitefinity.LibrariesRadUploadHandler"/> <remove name="Telerik.Sitefinity.AsyncImageUploadHandler"/> <remove name="Telerik.Web.UI.SpellCheckHandler"/> <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> <add name="WcfHandler" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" resourceType="Unspecified" preCondition="integratedMode"/> <add name="WildCard" path="*" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="classicMode,runtimeVersionv2.0,bitness32"/> <add name="Telerik.Web.UI.DialogHandler" path="Telerik.Web.UI.DialogHandler.axd" verb="*" type="Telerik.Web.UI.DialogHandler, Telerik.Web.UI"/> <add name="Telerik.RadUploadProgressHandler" path="Telerik.RadUploadProgressHandler.ashx" verb="*" type="Telerik.Web.UI.Upload.RadUploadProgressHandler, Telerik.Web.UI"/> <add name="Telerik.Sitefinity.FilesDownloadHandler" path="Telerik.Sitefinity.FilesDownloadHandler.ashx" verb="*" type="Telerik.Sitefinity.Modules.Files.FilesDownloadHandler, Telerik.Sitefinity"/> <add name="Telerik.Sitefinity.LibrariesRadUploadHandler" path="Telerik.Sitefinity.LibrariesRadUploadHandler.ashx" verb="*" type="Telerik.Sitefinity.Modules.Libraries.Web.LibrariesRadUploadHandler, Telerik.Sitefinity"/> <add name="Telerik.Sitefinity.AsyncImageUploadHandler" path="Telerik.Sitefinity.AsyncImageUploadHandler.ashx" verb="*" type="Telerik.Sitefinity.Modules.Libraries.Web.AsyncImageUploadHandler, Telerik.Sitefinity"/> <add name="Telerik.Web.UI.SpellCheckHandler" verb="*" path="Telerik.Web.UI.SpellCheckHandler.axd" type="Telerik.Web.UI.SpellCheckHandler, Telerik.Web.UI"/> </handlers> </system.webServer> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" appliesTo="v2.0.50727"> <dependentAssembly> <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/> <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/> <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> </dependentAssembly> </assemblyBinding> </runtime></configuration>Hi Mattc,
Hi Maciej
I will go through the process again and document it all and see if it works again for me.
Re 3.7 the last time I migrated the DB it flagged up several incompatibilities with SQL Azure so that sounds interesting. Do you have the SQL script that you ran?
As with all Azure Apps the files in the web app itself are read only which presents problems if the app wants to write to the App_Data or anywhere else to store config. You can store files on the local instance storage but not in the web site structure itself it seems. I'm trying to find out if Microsoft have a plan to change this as I think it would massively increase the number of existing ASP.NET Apps that could immediately be migrated to Azure. I blogged about the situation:
http://blog.matthewcooper.info/2010/08/new-azure-functionality-that-would.html
Would be interested in hearing your experiences.
Yes it is fast isn't it! Both SQL and the hosting are impressive, even on small instances. I guess it's so trimmed down that all the resources are available to the App. SQL Azure is amazing I think, especially in terms of the High Availability features.
Matt
Hello Mattc,
Hi Maciej
Thanks for that, will have a look at it.
I have been thinking further about the way Sitefinity stores it's configuration and how this would work in a multi role Azure deployment.
As the App cannot write to App_Data you cannot change the configuration and each role will not reflect the updates even if they could be applied as they would only apply to the machine that handled the request to change the setting.
So here is a proposed solution, would like to know what others think and whether it is a change that could be made to Sitefinity 4.
Declare a local resource in the web role, as below in the service definition file, this gives us a read/write area on each Role.
<LocalResources> <LocalStorage name="SitefinityConfig" sizeInMB="20" /></LocalResources>Hey guys,
Just curious as to HOW dramatic the performance increase is?
So for example if on a standard virtual server my aspx is delivered in 500ms (not counting linked resources, just raw html), are we talking like 20ms on azure? :)
Steve
Hi Steve,
Hi Guys
I'd like to see an answer to Matt's question:
Can we change the location of the config store to an Azure blob, i.e. can we change it from App_Data?
as I am ready to start contributing to this process, as I want to host all of my SiteFinity 4 projects in Azure going forward for my customers.
Hello Brian,
You can change the default configuration storage through Global.asax file and SettingsFolder property of SitefinityConfiguration.
protected void Application_Start(object sender, EventArgs e) var c = Config.SectionHandler.SitefinityConfiguration; c.SettingsFolder = "~/App_Data/Sitefinity/";This is great that you can change it! I agree that it is not a good idea to move it for a regular web server install, but on Azure, you need to do it.
I think we can use an Azure Drive, which uses a page blob, The NTFS virtual drive shows up as a drive letter to the Azure application (SiteFinity). Here are some relevant snippet's from Microsoft's documentation:
With Windows Azure Drive, your
Windows Azure applications running in the cloud can use existing NTFS APIs to
access a durable drive. This can
significantly ease the migration of existing Windows applications to the cloud.
The Windows Azure application can read from or write to a drive letter (e.g.,
X:\) that represents a durable NTFS volume for storing and accessing data. The Page Blob can be mounted as a drive only within
the Windows Azure cloud, where all non-buffered/flushed NTFS writes are made
durable to the drive (Page Blob). If the application using the drive crashes, the data remains
persistent via the Page Blob, and can be remounted when the application
instance is restarted or remounted elsewhere for a different application
instance to use. Since the drive is an NTFS formatted Page Blob,
you can also use the standard blob interfaces to upload and download your NTFS
VHDs to the cloud.
Windows Azure Drive can optionally cache the drive
data on a local disk on the VM. Caching
the data on the local drive will reduce the read traffic to the page blob,
which will reduce the transaction cost.
This is because there is no additional transaction charge for reads that
are to the local disk cache, whereas the transactions against the Page Blob are
counted towards billing. Note, even
when the cache is enabled, all non buffered and flushed writes are committed
transactions to the Page Blob in durable storage.
I will try this myself soon and report the results.
Hi Brian
Hi Guys
I m a beginner of Windows azure and Sitefinity as well .
Can somebody help me to Host Sitefinity Webapplication to microsoft windows azure
I have tried a lot but getting a lot of error.
If somebody have testapp.
Please reply me ASAP
Thanks in advance
Hi deepak
At the moment Sitefinity is not quite ready to run on Azure. As soon as it is ready I will be testing it out and will post instructions here.
M
Is http://sitefinity.cloudapp.net still working any one? It's currently not pulling up from my end. Are there any other examples of sitefinity websites running on the azure platform (I've had a difficult time finding one)?
Hi Darith
I registered this app name originally and then transferred it to a Telerik account that Gabe gave me access to.
I'm not sure if they still have it reserved.
Lots of people are playing with getting 4.1 running on Azure, Brian mentions he has it running in this post.
http://www.sitefinity.com/devnet/forums/sitefinity-4-x/general-discussions/sitefinity-4-1-on-azure-is-the-config-persistent.aspx#1647940
It looks like the SF team are working towards a persistent config and maybe some interesting other changes to Azure compatibility in the next SP releases.
Let us know of your experiences. Gabe, are you planning an official Azure demo site?
Matt