C# AngularJS + WCF REST File Upload

TheRepatriate

Lt. Junior Grade
Registriert
Nov. 2008
Beiträge
258
Hallo zusammen,

ich arbeite gerade an einer WCF Service Methode zum File Upload. Die Dateien sollen in einer AngularJS App selektiert und dann an einen WCF REST Service geschickt werden. Der WCF Service speichert dann ein paar "Metadaten" (Dateiname, Format...) in einer Datenbank und lädt die eigentliche Datei in einen Microsoft Azure Blob Storage Container. Das funktioniert bereits insofern, als ich PDF Dateien in den Azure Storage laden und wieder auslesen kann. Nun sollen aber auch Bilder hochgeladen werden können. Bei diesen scheitert es aber. Der eigentliche Stream scheint im Storage anzukommen, allerdings sind die Dateien (.jpg, .png) wenn man sie wieder herunterlädt beschädigt. Da ich mich wenig bis gar nicht mit dem Umwandeln von Streams in Images etc. auskenne, wollte ich euch mal fragen, ob ihr eventuell eine potentielle Fehlerquelle ausmachen könnt.
Hier einmal relevante Codeausschnitte:
In der AngularJS App gibt es einen Service für den Upload von Files. Das eigentliche selektieren passiert über die HTML5 File-API:
PHP:
srv.uploadFile = function(id, file){
        return $http.post(DEV_ENV_CONFIG.BASE_SERVER_URL + '/xml' + '/fileUpload/' + file.name + '/' + id, file,
            {withCredentials: true, headers: {'Content-Type': undefined }, transformRequest: angular.identity}).then(function(response){

            });
    };
Die Dateien werden dann von WCF als Streams entgegengenommen (hier eine beispielhaftes Operation-Interface):
PHP:
[OperationContract]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "xml/fileUpload/{fileName}/{expenseId}")]
        void FileUploadAsXml(string fileName, string expenseId, Stream Args);

Wenn ich diesen Stream nun als File abspeichere, oder auch in den Blob-Storage lade ist die Datei beschädigt (es sei denn es ist eine PDF-, oder TXT-Datei). Ich habe bereits versucht den Stream zuerst in ein byte-Array, MemoryStream zu konvertieren oder auch zuerst ein Bitmap- bzw. Image-File daraus zu machen. Alles aber bisher ohne Erfolg.
Da ich mich mit Streams und dem umwandeln in Images nicht auskenne wollte ich mal Fragen, ob ihr vielleicht eine Lösungsmöglichkeit kennt bzw. wisst wo der Fehler liegen könnte.
Vielen Dank im Voraus
 
Wäre es nicht einfacher mit ApiController zu arbeiten? WCF Rest ist eingeltich ein Missbrauch von WS-* ;)
Also file ist dein HTTP POST Body oder? Vielleicht fehlt dir einfach bei Stream [FromBody] Attribut. Du musst aber auch aufpassen, dass file auch wirklich als Stream deserialisierbar ist.
 
Hey, danke dir für die Antwort, dachte der Thread wäre eh schon untergegangen :)
Zum Thema WCF und REST äußere ich mich lieber nicht :rolleyes: . Das Projekt an dem ich arbeite habe andere Leute ins Leben gerufen. Ich habe zwar noch relativ wenig Ahnung von .Net-Technologie, Web-API hätte in unserem Anwendungsfall aber glaube ich in der Tat mehr Sinn gemacht.

Zum eigentlichen Problem: Ich habe das Problem inzwischen gelöst. Die selektierten Dateien werden als FormData-Streams versendet. Der eingehende Stream enthält daher neben dem reinen Bild auch Meta-Informationen (Filename, contentType). Das war mir vorher nicht bewusst, ist mir aber dann durch Vergleich der Original-Datei mit der eingehenden-Datei recht schnell klar geworden.
Man muss also aus dem eingehenden Stream erstmal das eigentliche Bild/Content extrahieren. Stichwort Multipart-Parser.

LG
 
Zurück
Oben