Forums / General Discussions / Sitefinity 4.0 Beta running on Azure, now!

Sitefinity 4.0 Beta running on Azure, now!

31 posts, 0 answered
  1. mattc
    mattc avatar
    105 posts
    Registered:
    11 Aug 2007
    10 Aug 2010
    Link to this post
    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
  2. Gabe Sumner
    Gabe Sumner avatar
    440 posts
    Registered:
    09 Sep 2007
    10 Aug 2010
    Link to this post
    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.)   :)

    --

    For anyone following in your footsteps, what did you need to do to get this to work?  Did you simply change the connectionString for the database?  Did you create the database locally and then migrate (by hand) this database to SQL Azure?  Or did you let Sitefinity 4.0 create the SQL Azure database (tables, etc.)? 

    Were any other customizations needed?

    --

    We've had some internal conversations about this.  One concern I have is the SQL Azure database limit (50GB).  This is a lot of storage for a single Sitefinity web site but, in theory, a single Sitefinity installation could host many different web sites.  With media being stored, by default, in the database this could present a scaling problem.  

    As you mentioned, Sitefinity is stateless, so I'm not terribly worried about the front-end servers.  I'm more worried about the data storage piece of this.  The 50GB database limit kills the promise of infinite scaling.  As you mentioned, long-term it would be nice to have SQL Storage providers for key modules (images, documents, videos).

    --

    Another random question:

    Does the Configuration editor work fine?  (This editor modifies XML files in ~/App_Data).  I'm also assuming this would only modify the XML files for that single server.  How would those configuration settings be synchronized between the other servers?

    --

    Anyway, these are my stream of consciousness questions.  Don't feel compelled to address all of this.  These are normally the questions I aim internally at the Sitefinity team.  But you volunteered...     :)

    Great job on this.  Very exciting.  

    Gabe Sumner
    Telerik | Sitefinity CMS
  3. mattc
    mattc avatar
    105 posts
    Registered:
    11 Aug 2007
    10 Aug 2010
    Link to this post
    Hi Gabe

    Sorry, I couldn't wait to give it a go, have been waiting for 4.0 to play with Azure for ages :)

    I took a DB created in local SQL and migrated it using SQL Azure MW at http://sqlazuremw.codeplex.com/
    This goes through the DB and checks for any inconsistencies in the Azure subset of SQL server. I was very pleased that there weren't any, I tried this with a 3.7 DB a while ago and ran into lots of problems. It will also script the data and BCP it to the newly formed tables so might actually be a pretty cool deployment option for pre populated deployments.

    I tested it all worked by then pointing a standard local Sitefinity site to the Azure DB, bit slow but cool.

    I then created a new Cloud service project, copied all the Sitefinity code over from an existing project, fiddled with namespaces etc, merged the 2 web.configs to leave the stuff that needed to be there for a cloud app. You also need to leave files like WebRole.cs etc.

    I could then run it in the dev fabric and it worked fine, so just packaged it, changed the logging providers to Blob Storage and deployed it, all worked a dream.

    DB wise yes obviously there is currently the 50GB limit. This starts to get expensive too and while I'm sure they will increase the sizes it's not really the ethos of the platform. I would say we need to keep all heavy content like docs/images/video out of the the DB or at least in a different copy? You would get faster performance from 10 5 GB instances than one big one.... The ideal though is to have all this content stored in Blob Storage as this won't slow down as it grows huge (if we partition by user etc) and we can also possibly feed it into the CDN for even better perfomance.

    Yes the Configuration folder in App_Data is the main problem as it's read only, you get the following message when you try o save a config change:
    Access to the path 'E:\approot\App_Data\Sitefinity\Configuration\ToolboxesConfig.config' is denied.

    The only way round this is to provide a provider to store the config files on Blob Storage and serialize/deserialize them as needed as per here http://brendan.enrick.com/post/Storing-and-Retrieving-Serialized-Data-with-Azure-Blob-Storage.aspx This way any number of Roles can read/write them and they are not at the mercy of the instance recycling as well.. I believe projects like http://orchardproject.net/ are already storing app_data files that might change here as well. It would be much better place for the error log as well and is the best practice as all logging data from individual instances I copy to a Blob Store where you can analyze them at your will.

    I think you have the front end and DB sorted for Azure, think we just need to add a couple of providers to make the config run properly and allow storage in Blobs. You already had an Amazon provider videos for 3.7 as I remember so shouldn't bee too big a deal? Reading configs should be fine as it's just getting a stream from Blob storage rather than reading it from the filesystem?

    It would be a real shame if 4 wasn't completely Azure capable as it's so close, I think it will be an incredibly powerful product in the cloud.

    I'm happy to work to help make it happen, I have some grand ideas for it but needs to have the power of being able to run many front ends and have a HA SQL system behind it :)

    Matt









  4. mattc
    mattc avatar
    105 posts
    Registered:
    11 Aug 2007
    10 Aug 2010
    Link to this post
    update:

    Just noticed the Analytics data seems to have vanished, still data on Google but none on Siefinity..

    M

    Update:
    So I'm guessing the Analytics module tries to store data locally? It seems to do odd things, I can't see any files that it's creating on a normal installation though.

    Started getting a spate of errors saying the DB connection was already closed. Remembered that using ORM with Azure you need to tell it to turn off MARS as it's not supported on Azure.  So I updated the connection string and redeployed it and it seems to have fixed it, although I don't know the effect of the re-deploy. Memory is a little fuzzy but think ORM has some settings to cope with checking to see if the connection is still open?

    Another really strange phenomenon was that after I redeployed the Web Roles there was no page set as the homepage......

    Will keep monitoring it for more issues.

    M
  5. krishna
    krishna avatar
    1 posts
    Registered:
    11 Aug 2010
    11 Aug 2010
    Link to this post
    I'm getting an error when I launch http://sitefinity.cloudapp.net
    Did you unload?
  6. mattc
    mattc avatar
    105 posts
    Registered:
    11 Aug 2007
    11 Aug 2010
    Link to this post
    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>

    Its the <testOnAlloc> setting I think we need.

    In the ORM docs it says:

    Test connection before use - when this property is set to True, then each connection is validated before leaving the pool. This may have a serious negative impact on performance, so this property is set by default to False. The name of this setting in the App.config file is <testOnAlloc>.

    Going to mean more calls but think this is whats doing it.

    Now just need to find where in Sitefinity I can modify the ORM configurations...

    M
  7. mattc
    mattc avatar
    105 posts
    Registered:
    11 Aug 2007
    11 Aug 2010
    Link to this post
    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
  8. Neil
    Neil avatar
    82 posts
    Registered:
    21 Oct 2006
    11 Aug 2010
    Link to this post
    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
  9. Georgi
    Georgi avatar
    3580 posts
    Registered:
    24 Sep 2012
    11 Aug 2010
    Link to this post
    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.

    All the best,
    Georgi
    the Telerik team
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  10. mattc
    mattc avatar
    105 posts
    Registered:
    11 Aug 2007
    11 Aug 2010
    Link to this post
    Hi nenwmn

    The answer to your question is lots more! I think $200 a month for 2 Web Roles (small instances), a 1GB DB and a Storage account for log files etc is probably ballpark but thats a theoretical calculation and pretty much the minimum.
    However, I don't think you can really compare a shared hosting account with the Azure platform, they are different ends of the hosting spectrum. 

    When you buy a shared hosting package you are typically buying a website on a shared server and maybe a SQL database on another shared machine. It obviously varies how much contention there is but I have used shared providers (albeit not for a while) where there were 200 SQL DBs on a single server! At the end of the day if you are paying $10 a month you can't complain.
    As well as just sharing 1/200th of the resources of that server you are at the mercy of other events like the server being rebooted because someone else has caused a problem. In the event the server fails, the hosting company is going to have to restore all the data from backup, at which point you are just one of 200 people asking when your data will be available again.

    With azure you are basically paying for your own dedicated servers on demand, so you are not going to get the webserver going very slow or the DB server being rebooted because of someone else. However the Azure services go much further in terms of availability, resilience and flexibility.

    One of the main attractions of Azure is the fact that it is so highly available. Take SQL Azure as a good example, it has a 99.9% SLA because of the way it is designed. The Azure system stores 2 copies of your database (in different places) and applies any changes you make to both copies in real time, so it has 2 current systems at any one time. Say the currently in use one fails, then the system will fail over to the other copy and carry on. You will be unaware of this, as will your apps. To get this, even in a dedicated hosting environment you are looking at clustering/transaction log shipping (so multiple servers) or other virtualisation plan such as VMware with VMotion so that your server is not dependent on one set of hardware (if the server fails the machine will migrate to new hardware without stopping).  When you start to look at the costs of these plans, then Azure looks very good value because you don't have to invest up front in the infrastructure but also you don't need that in house expertise of clusters, SANs, load balancers etc.

    Finally with cloud systems like Azure you have the elegance of ultimate scalability, not just for day to day loads but for development, testing etc.. Day to day you can double your webserver count instantly from MMC or the web portal, no need to worry about building servers, deploying code, adding to load balancers! Scale them up when you have busy times, down when things are quiet. There is a great example here of how you can create apps that you just couldn't do on traditional dedicated server systems. (They were starting up hundreds of SQL instances and Web Roles for a ticketing site when selling tickets for large stadiums which causes huge spikes in traffic for a few minutes!)
    Development wise it gets even better. If you want to test out how a new version of your code is going to work under exact live conditions, then you can deploy a clone of your site and test it under load so you aren't going to get any surprises when you go live.

    So in summary, I think Azure is aimed at the dedicated server market rather than the shared hosting market. The costs are higher but the benefits are so much greater as well.

    Regards

    Matt



  11. Neil
    Neil avatar
    82 posts
    Registered:
    21 Oct 2006
    11 Aug 2010
    Link to this post
    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
  12. Brian Womack, PhD
    Brian Womack, PhD avatar
    3 posts
    Registered:
    13 Mar 2009
    11 Aug 2010
    Link to this post
    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.
  13. mattc
    mattc avatar
    105 posts
    Registered:
    11 Aug 2007
    11 Aug 2010
    Link to this post
    Hi Brian

    Glad to hear that there are others outside of Telerik who are very excited by this! :)

    Having contacted the Sitefinity team re a couple of things I found as a result of this deployment I know that they are soon to start getting to grips with the Azure support for 4.0. I was really impressed that it seems almost ready and yet it hasn't been suggested as being supported in the Beta. So think there will be lots of exciting work going on over the next weeks building up to a RC release.

    Personally I think that allowing the  config and assets to be stored in the DB and/or on Azure or other Cloud provider blob storage is the way to go. As you say with a switch or two it could be deployed in either mode. Lots of these changes would better suit a web farm environment as well as the Cloud one.

    I think the providers for storing content outside of the main DB will be along shortly, if not in the release then soon afterwards, or if not the community can write them once we get hold of the SDK. @Rok_b tweeted yesterday that he had already done some work on an Azure Blob storage provider for RadEditor http://is.gd/ebsgf

    Sitefinity is being developed with extensibility as the mantra so I'm sure just about anything will be possible.

    Regards

    Matt



  14. Markus
    Markus avatar
    3 posts
    Registered:
    06 Nov 2007
    27 Aug 2010
    Link to this post
    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
  15. Maciej Skiba
    Maciej Skiba avatar
    15 posts
    Registered:
    28 Sep 2009
    09 Sep 2010
    Link to this post
    Hello Mattc,

    I have tried to follow your step to run sitefinity 4 under Azure, but I have encountered a problem during running project locally under app fabric. I am getting AppDomainUnloadedException and webapplication fails to start. Could describe a bit more precisely how you run sitefinity 4 under Azure? I mean what section of original web.config file you copied into sitefinity web.config, what changes have you made to namespaces in project etc. I would really appreciate some help with this issue.
  16. mattc
    mattc avatar
    105 posts
    Registered:
    11 Aug 2007
    15 Sep 2010
    Link to this post
    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>
  17. Maciej Skiba
    Maciej Skiba avatar
    15 posts
    Registered:
    28 Sep 2009
    15 Sep 2010
    Link to this post
    Hi Mattc,

    I have tried this method of creating cloud app too, but I still got that exception. Maybe the problem is in different place than in web.config.

    I have also tried to migrate Sitefinity 3.7 SP3 database into SQL Azure, and despite of what you wrote in your previous posts, this database has migrated to SQL Azure successfully too. And as the Sitefinity 3.7 works good as a cloud app, so now I have a Sitefinity 3.7 website hosted on windows azure with database on SQL Azure (performance of this combination is quite amazing). I have thought to myself that everyone who is interested in Azure and Sitefinity should know that.

    --
    Regards,
    Maciej.
  18. mattc
    mattc avatar
    105 posts
    Registered:
    11 Aug 2007
    15 Sep 2010
    Link to this post
    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
  19. Maciej Skiba
    Maciej Skiba avatar
    15 posts
    Registered:
    28 Sep 2009
    15 Sep 2010
    Link to this post
    Hello Mattc,

    I cannot give you that script because it contains data of company I am working in. But I have included a link to a backup of another sitefinity 3.7 database (It contains one of sample websites that comes with sitefinity installation). During my experiments with SQL Azure I have successfully converted and migrated this database to SQL Azure too. You can restore this database on your local MS SQL Server and try to migrate it yourself.


    --
    Regards,
    Maciej.
  20. mattc
    mattc avatar
    105 posts
    Registered:
    11 Aug 2007
    21 Sep 2010
    Link to this post
    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>

    Create a Blob store and copy up our starting config to it, this provides not only a centralized config store but also a persistent one.

    When we start the Role we copy the contents of the config to the local machine to speed up reads etc.

    Write some sync code so that when the config is changed on the local machine or on the Blob Store we sync with the Blob Store again. This would take some tuning but it's all possible, in his blog post, Steve Marx runs the whole site from the Blob Store!

    The only remaining question for the Sitefinity Team is: Can we change the location of the config store, ie can we change it from App_Data?

    M
  21. Steve
    Steve avatar
    2818 posts
    Registered:
    03 Dec 2008
    21 Sep 2010
    Link to this post
    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
  22. Maciej Skiba
    Maciej Skiba avatar
    15 posts
    Registered:
    28 Sep 2009
    22 Sep 2010
    Link to this post
    Hi Steve,

    I have not performed any measurements so far, but site on azure is noticeably faster than one hosted on traditional hosting (the difference is especially visible on back-end pages and in response times).

    --
    Regards,
    Maciej.
  23. mattc
    mattc avatar
    105 posts
    Registered:
    11 Aug 2007
    22 Sep 2010
    Link to this post
    Hi Guys

    Have a look at http://orm.cloudapp.net
    This is a test of one of the Telerik ORM demo apps (Sofia Car Rental) running on Azure. It is running on a single small Web Role and with an Azure SQL DB behind it.

    This has been running for several days and I had an HTTP monitor on it, just requesting the root page.
    The average response time to return the page is 121ms. I have not tried the different machine sizes yet.

    Matt



  24. Brian Womack, PhD
    Brian Womack, PhD avatar
    3 posts
    Registered:
    13 Mar 2009
    01 Dec 2010
    Link to this post
    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.
  25. Ivan Dimitrov
    Ivan Dimitrov avatar
    16059 posts
    Registered:
    24 Sep 2012
    01 Dec 2010
    Link to this post
    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/";
    }

    I do not recommend changing the default location.

    Kind regards,
    Ivan Dimitrov
    the Telerik team
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
  26. Brian Womack, PhD
    Brian Womack, PhD avatar
    3 posts
    Registered:
    13 Mar 2009
    01 Dec 2010
    Link to this post
    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.
  27. mattc
    mattc avatar
    105 posts
    Registered:
    11 Aug 2007
    14 Dec 2010
    Link to this post
    Hi Brian

    Yes this has possibilites :)
    I think you can only have one machine accessing the drive read/write though?, so may not be a solution for multiple instances of the web role, but may be good for a single instance as it is obviously persistent.

    Have you given it a go yet?

    Regards

    Matt
  28. deepak
    deepak avatar
    1 posts
    Registered:
    12 Jun 2012
    05 Jan 2011
    Link to this post
    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
  29. mattc
    mattc avatar
    105 posts
    Registered:
    11 Aug 2007
    05 Jan 2011
    Link to this post
    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
  30. Darith
    Darith avatar
    1 posts
    Registered:
    25 Mar 2011
    16 May 2011
    Link to this post
    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)?
31 posts, 0 answered
1 2