2013-02-20 10 views
7

Wir verwenden ASP.NET MVC 4, um Benutzern das Hochladen von Video und Audio über unsere Website zu ermöglichen. Ich möchte Azure Media Service als Back-End dafür verwenden.So laden Sie den Stream zu Azure Media Services

Während der folgenden Azure's tutorial, das Problem, das ich habe, ist, dass das Azure Media Services SDK scheint nicht zu ermöglichen, einen rohen Datenstrom hochladen. Stattdessen verwendet die einzige Upload-Methode, die ich finden könnte, ein Pfadstring-Argument.

Ich möchte vermeiden, die Datei auf der Festplatte zu speichern (it's already streamed to disk by default), und in der Lage sein, die angeforderte Datei bis hin zu Azure zu streamen.

Hier ist mein Code so weit:

public void SaveMedia(string fileName, System.IO.Stream stream) 
{ 
    CloudMediaContext mediaCloud = new CloudMediaContext("account", "key"); 
    AssetCreationOptions assetOptions = new AssetCreationOptions(); 
    var asset = mediaCloud.Assets.Create(fileName, assetOptions); 

    var assetFile = asset.AssetFiles.Create(fileName); 

    var accessPolicy = mediaCloud.AccessPolicies.Create(fileName, TimeSpan.FromDays(3), AccessPermissions.Write | AccessPermissions.List); 

    var locator = mediaCloud.Locators.CreateLocator(LocatorType.Sas, asset, accessPolicy); 

    assetFile.Upload("????????????"); 

    locator.Delete(); 
    accessPolicy.Delete(); 
} 

Wie kann man dies erreichen? Würde dies zu Konflikten mit "Best Practices" bei der Verarbeitung von Uploads mit ASP.NET MVC 4 und Azure Media Services führen?

Antwort

10

Sie sollten die Azure Media Services nicht zum Hochladen verwenden. Sie ist nicht für Inbound-Stream-to-Azure-Speicher-Blob ausgelegt, was Sie beschreiben.

Verwenden Sie das Azure Storage SDK direkt (verwenden Sie v1.7, um Probleme beim erneuten Binden zu vermeiden). Das Storage SDK ermöglicht Stream-Schreibvorgänge in Blobs. Um dies zu tun, müssen Sie zuerst einen SAS-Schreib-Locator erhalten (sieht so aus, als wären Sie dort) und dann den locator.Path.Segments verwenden, um den Asset-Container zu finden. Verwenden Sie diese Option dann, um direkt mit CloubBlobClient in das Storage SDK hochzuladen - es bietet irgendwo eine Stream-Write-Funktion.

Hinweis in Ihrem Code oben: Sie geben AssetCreationOptions.None nicht an, daher wird davon ausgegangen, dass die Dateien im Speicherspeicher verschlüsselt sind (der Standardübertragungsmechanismus ist sicher, nicht ungesichert). Ich denke nicht, dass Sie die Speicherverschlüsselung in Ihrem Dateistream vor dem Hochladen durchführen, also sollten Sie das am besten auf AssetCreationOptions.None einstellen.

Persönlich würde ich diese Route nicht gehen. Lesen Sie meine Blog-Post auf ‚erstellen Sie Ihre eigene youtube‘: http://blog-ndrouin.azurewebsites.net/?p=1471

Darin gibt es ein vollständiges Beispiel von Client-hochgeladenen Inhalten einer SAS-URL von der Server-Seite zur Verfügung gestellt (die Ihre Kontoinformationen haben, dass Sie wahrscheinlich nicht auf der Client-Seite herumlaufen wollen!).

Der Client muss jedoch in der Lage sein, mit dieser SAS-URL einen PUT in den Speicher zu schreiben. In meinem Fall habe ich eine C# -Befehlszeilen-App verwendet. In HTML5 ist dies nicht möglich, es sei denn, Ihre Webseite wird in der gleichen Domäne wie das Zielspeicherkonto gehostet. Wenn sich Ihre Webseite (oder ein I-Frame, der die Uploads verwaltet) nicht in der Domäne Ihres Speicherkontos befindet, löst dies einen CORS- "OPTIONS" -Aufruf in HTML5 für den Azure Storage-REST-Layer aus, der CORS noch nicht unterstützt .

Alternativen zu einem in Ihrem Speicherkonto gehosteten HTML5-I-Frame sind: Sliverlight- oder Flash-Upload-Shims mit einer domänenübergreifenden Datei im $ root Ihres Speicherkontos (oder möglicherweise die in Ihrem Speicherkonto gehosteten Plugin-Objekte) die domänenübergreifende Dateianforderung).

Ich würde entmutigen, den Filestream auf den Server in einem POST hochzuladen. Dies macht Ihren Web-Service zu einem Engpass für alle eingehenden Dateien. und ein langer POST ist nicht besonders stabil: Ihr App-Pool kann mitten in einem Upload recycelt werden und Sie sind Toast.

PS.Unser Team (Windows Azure Media Services) überwacht in erster Linie in diesem Forum:

http://social.msdn.microsoft.com/Forums/en-US/MediaServices/threads

+0

Danke für die Antwort und die Richtung! Ich werde versuchen, die Schritte in Ihrem Artikel so gut wie möglich zu implementieren. Wir würden gerne eine HTML5-Lösung an beiden Enden implementieren (Uploader und Streamer). –

Verwandte Themen