none
IIS Virtual Directory mapping - Azure

    Frage

  • Hallo,

    da Windows Azure ja zur Zeit keine persistenten VM's bietet und die hochgeladenen Daten nach einem Rolerestart verloren gehen, müssen Daten persistent im Blob bzw. im Windows Azure Drive gespeichert werden.

    In unserem Content Management System muss natürlich eine möglichkeit geschaffen werden Files abzuspeichern, die aber wiederrum über einen Webseite call aufgerufen werden können, hier tritt nun das Problem in Kraft, dass die Daten persistent gespeichert werden müssen und somit im Blob bzw. im Windows Azure drive gespeichert werden müssen.

    Der Ordner der als Virtual Directory eingerichtet werden müsste wäre "portaldata" das bedeutet "sitesroot/0/portaldata/", wie ist es möglich nun dem iis zu sagen dass das "Portaldata-Verzeichnis" auf einem Blobstorage liegt und er sich dort die Daten herstreamen würde.
    Würde hier die Möglichkeit des "Virtual Path Providers" greifen wie in http://social.microsoft.com/Forums/de-DE/partnerdepresales/thread/717bac9a-17f6-4434-84a8-dfc4ed38a8d8 gefragt, oder ist das nicht der richtige ansatzpunkt.

    Ein RessourceCall könnte aussehen "www.meineWebseite.com/portaldata/meineBilder/meinBild.jpg" natürlich sind auch .pdf, .xml etc. möglich.

    Die zweite Frage die sich stellt, wäre es möglich den ganzen IIS für Variante 2 (Windows Azure Drive) zu Mappen, d.h. ich habe eine Dummy Windows Azure Projektdatei, die ein WebRole -Start event besitzt, hier wird ein Windows Azure Drive gemountet, aufdem die ganze Webseite mit Portaldata etc. persistent liegt (da es ja ein Pageblob ist), und dieses gemoutete Drive dann wiederrum meinem IIS als Rootpfad gebe wo er die Applikation findet (via code natürlich).

    Ich hoffe es ist verständlich, ansonsten wäre ich auch gerne Bereit diese Art von Frage via Telefon zu klären.

    Vielen vielen Dank schonmal, diese Art von Problem ist ziemlich _Wichtig_ für uns!

    Freundliche Grüße

    Lars
    Update:

    Durch weitere recherchen bin ich auf einen "http-handler" gestoßen, den man hinterlegen könnte, hier könnte man Theoretisch den Fileaufruf abfangen und den Stream von einem Blob/File System o.ä. holen und diesen als repsonse zurückgegeben?

    Dieser Handler könnte ja sofern mit einem "*.*" belegt werden, damit alle Fileaufrufe gecatcht werden. Fraglich ist es nur mit ".ascx bzw. .aspx" Dateien, hier habe ich nur die Information, dass diese Standardmäßig vom IIS ignoriert werden, aber was würde passieren wenn eine normale .ascx Seite von unsererm System aus aufgerufen wird ala www.meineSeite.de/desktopdefault.ascx o.ä. würde dies der Httphandler catchen?

    Wenn dies so funktioniert wäre es möglich das Virtual Directory mit einem Blobstorage zu "hinterlegen", bzw. dem IIS etwas vorzugaukeln ;)

    Vielen Dank erneut.

    Viele Grüße

    Lars

    Update 2:

    Die zweite Frage die sich stellt, wäre es möglich den ganzen IIS für Variante 2 (Windows Azure Drive) zu Mappen, d.h. ich habe eine Dummy Windows Azure Projektdatei, die ein WebRole -Start event besitzt, hier wird ein Windows Azure Drive gemountet, aufdem die ganze Webseite mit Portaldata etc. persistent liegt (da es ja ein Pageblob ist), und dieses gemoutete Drive dann wiederrum meinem IIS als Rootpfad gebe wo er die Applikation findet (via code natürlich).

    Diesen Teil konnte ich bereits Lösen, es ist möglich ! :)

            Dim driveLetter As String = myCloudDrive.Mount(25, DriveMountOptions.None)
    
                If driveLetter.EndsWith("\") = False Then
                    driveLetter = driveLetter & "\"
                End If
    
                Dim serverManager As New Microsoft.Web.Administration.ServerManager
    
                For i As Integer = 0 To serverManager.Sites.Count - 1 Step +1
                    If serverManager.Sites(i).ToString.StartsWith(RoleEnvironment.CurrentRoleInstance.Id) = True Then
                        serverManager.Sites(i).Applications("/").VirtualDirectories("/").PhysicalPath = driveLetter
                        serverManager.CommitChanges()
                        Exit For
                    End If
                Next

    Grüße

    Lars



    Freitag, 23. März 2012 10:05

Antworten

  • Hallo Zusammen,

    ich habe mein Problem nun selbst gelöst, es ist möglich über einen Virtual Path Provider die Files handeln zu lassen, zusätzlich muss via die Web.config

            <add name="myAspxHandler" path="*.aspx"  verb="*" type="System.Web.UI.PageHandlerFactory"  />
            <add name="myWebResourceHandler" path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader"/>
            <add name="MyStaticFileHandler" path="*.*" verb="GET,HEAD" type="System.Web.StaticFileHandler"/>
    

    eingefügt werden.

    Wichtig ist: Die Open-Variante vom VirtualFile-Handler muss das File mit einem "ReadAllBytes" auslesen und danach mit einem System.IO.MemoryStream(MyReadedBytes()) zurückgeben.

    Gruß

    Lars

    • Als Antwort markiert contentXXL Dienstag, 27. März 2012 14:59
    Dienstag, 27. März 2012 14:59

Alle Antworten

  • Hallo Zusammen,

    nach ein paar Stunden Web-Suche bin ich auf einen interessanten Artikel gestoßen: http://allcomputers.us/windows_azure/integrating-blobs-with-your-asp_net-websites.aspx , (leider in Englisch tut mir leid), der genau diese Problematik beschreibt, bzw. es sieht für mich so aus.
    In diesem Artikel wird auch geschrieben dass hierfür ein HTTP-Handler genutzt wird.

    Gibt es wircklich nur diese Methodik, um auf die Files zuzugreifen, oder wäre es möglich ein Virtual Directory am IIS einzurichten der wiederrum auf http://app.blob.core.net/container/folder/file/?credentials zugreift?

    Viele Grüße

    Lars



    Freitag, 23. März 2012 13:39
  • Hallo Lars,

    Zunächst mal eine Klarstellung: Eine ascx-Datei ist ein benutzerdefiniertes ASP.NET User Control. So etwas wird eingebunden und nie direkt aufgerufen.

    >>Fraglich ist es nur mit ".ascx bzw. .aspx" Dateien, hier habe ich nur die Information, dass diese Standardmäßig vom IIS ignoriert werden

    Ich weiss zwar nicht auf welcher Technologiebasis euer CMS arbeitet, aber das sollte bei einem .NET basierten CMS nicht der Fall sein.

    Das Konzept mit den Virtual Path Provider kannst Du vergessen (Der Provider ist viel zu stark mit der web.config verknüpft und daher er für Azure ungeeignet.). Die Idee einen HTTP Handler zu benutzen ist in meinen Augen eine gute Lösung. Ob ein HTTP Handler mit "*.*" nutzbar ist habe ich noch nie ausprobiert. Ich werde dies aber sofort nachholen (wird das nächste Tutorial auf meiner Webseite).

    Informationen zu HTTP Handler in Deutsch findest Du hier:

    http://msdn.microsoft.com/de-de/library/bb398986.aspx 

    Schöne Grüße

    Oliver

    Montag, 26. März 2012 14:57
    Moderator
  • Hallo Oliver,

    ich habe es mit einem HTTP-Handler mit *.* ausprobiert, dieser wurde auch aufgerufen, das Problem ist, dass ich aber auch alle Calls von einer .ASPX bekomme, die ich natürlich nicht möchte!!!, ich habe es bereits mit       RouteTable.Routes.Add(New Route("*.aspx", New StopRoutingHandler())) sowie mit einem .Ignore ausprobiert, leider funktionieren beide Varianten nicht, man müsste einem HTTP-Handler sagen können "alle Files aber nicht .ascx sowie .aspx - da diese durch meinen VPP ausgewertet werden).

    Vielleicht findest du eine Lösung .ASPX sowie .ASCX-Extensions auszuschließen, ohne dass ich alle Typen registieren muss ala:"*.jpg, *.png, *.pdf" etc. etc. (macht meiner Meinung nach keinen Sinn da wie gesagt -> jeder Kunde kann seine selbstdefinierten Endungen haben).

    Grüße & Dank

    Lars

    Montag, 26. März 2012 15:03
  • Hallo Lars,

    mein erster Gedanke wäre jetzt gewesen über den Mime - Type zu gehen. Der Mime-Type schließt selbstdefinierte Endungen mit ein und Endungen von ASP.NET aus. Dann bin ich aber leider auch dort über zu mindesten eine Einschränkung gestolpert (Statische HTML Seiten und CSS - beide vom Mime-Type Text).

    Schöne Grüße

    Oliver

    Montag, 26. März 2012 15:22
    Moderator
  • Hallo Oliver,

    leider kann ich deinen Gedanken nicht verstehen über einen "Mimi-Type" zu gehen, wenn ich den Aufruf bei mir in den HTTP-Handler bekommen weiß ich ja welche Extension ich habe und kann über die Regestry den Zuständigen Typen auslesen.
    Das Problem ist dass ich dem HTTP-Handler nicht sagen kann, dass er ASCX sowie ASPX Seiten / Controls nicht behandeln soll.

            <add name="FIleHandler" path="*.*" verb="*"
          type="MyNameSpace.WithClass" />

    So funktioniert das ja auch, leider bekomme ich hier keine Einschränkung rein.
    Gibt es ggf. ein Standardmapping für die ASPX Seiten bzw. User Controls die ich im IIS Mappen könnte, damit der handler nicht mehr angesprochen wird und die Funktionen vom .NET Aufgerufen werden?

    Gruß

    Lars

    Dienstag, 27. März 2012 07:08
  • Hallo Zusammen,

    ich habe mein Problem nun selbst gelöst, es ist möglich über einen Virtual Path Provider die Files handeln zu lassen, zusätzlich muss via die Web.config

            <add name="myAspxHandler" path="*.aspx"  verb="*" type="System.Web.UI.PageHandlerFactory"  />
            <add name="myWebResourceHandler" path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader"/>
            <add name="MyStaticFileHandler" path="*.*" verb="GET,HEAD" type="System.Web.StaticFileHandler"/>
    

    eingefügt werden.

    Wichtig ist: Die Open-Variante vom VirtualFile-Handler muss das File mit einem "ReadAllBytes" auslesen und danach mit einem System.IO.MemoryStream(MyReadedBytes()) zurückgeben.

    Gruß

    Lars

    • Als Antwort markiert contentXXL Dienstag, 27. März 2012 14:59
    Dienstag, 27. März 2012 14:59