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