2016-05-04 9 views
12

Ich habe eine große Sammlung von Bildern auf einem gesicherten Server gespeichert von denen einige auf einer Welt zugewandten Portal angezeigt werden müssen. Der Server des Portals befindet sich in einer DMZ, die Anfragen erlaubt, aber verhindert, dass direkte Anfragen an die gesicherte Domäne weitergeleitet werden. Die Bilder werden mit SOLR katalogisiert und können über eine interne (Apache?) Server von http://intenalname/folderA/folderAB/file.jpgWeb API Controller konvertieren von MemoryStream in StreamContent

Inside my PhotoController heruntergeladen werden ich eine Instanz des WebClient erstellen können, geben Sie die URL und eine MemoryStream bekommen. Wenn ich versuche, diesen Speicher-Stream zu verwenden, um den response.content zu füllen, erhalte ich eine leere Antwort (pro Fiddler). Wenn ich den Speicherstream zum Schreiben in eine lokale Datei verwende, dann lese die Datei (unter Verwendung von FileStream und FileInfo) wie erwartet.

Ich sollte in der Lage sein, von einem MemoryStream zu StreamContent ohne durch das Dateisystem zu gehen (sollte ich nicht) ?? aber wie? Der Standardkonstruktor für StreamContent(stream) akzeptiert die Speicher-Stream-Instanz ohne einen Compiler-Fehler ... aber es funktioniert einfach nicht.

HttpResponseMessage response = Request.CreateResponse(); 

using (WebClient webClient = new WebClient()) 
{ 
    string url = string.Format(PHOTO_GET, filePath); 
    using (MemoryStream memoryStream = new MemoryStream(webClient.DownloadData(url))) 
    { 
     // If these lines are unremarked the stream moves 'through' the file system and works (?!) 
     //memoryStream.Position = 0; 
     //string tempName = @"c:\test\" + Guid.NewGuid().ToString() + ".jpg"; 
     //var fs = new FileStream(tempName, FileMode.OpenOrCreate); 
     //stream.CopyTo(fs); 
     //fs.Close(); 
     //FileInfo fi = new FileInfo(tempName); 

     response.Headers.AcceptRanges.Add("bytes"); 
     response.StatusCode = HttpStatusCode.OK; 
     //response.Content = new StreamContent(fi.ReadStream()); 
     response.Content = new StreamContent(memoryStream); 
     response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("render"); 
     response.Content.Headers.ContentDisposition.FileName = fileName; 
     response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpg");//("application/octet-stream"); 
     response.Content.Headers.ContentLength = memoryStream.Length; 

    } 

} 
return response; 

Wenn über Fiddler Prüfung erhalte ich:

[Fiedler] Readresponse() fehlgeschlagen: Der Server eine vollständige Antwort für diese Anforderung nicht zurückgekommen. Der Server hat 0 Byte zurückgegeben.

(wenn durch Filestream Fiddler gehen zeigt mir das Bild.)

+0

Haben Sie versucht, 'memoryStream.Position' auf 0 zurückzusetzen, wie Sie es im auskommentierten Code tun? – itsme86

+0

das ist eines der vielen Dinge, die ich ausprobiert habe ... keine Freude, danke aber –

Antwort

16

In Ihrem Code der Speicherstrom angeordnet wird, bevor es es ist Inhalt der Antwort passieren kann. Die zurückgegebene Antwort wird einen entsorgten Speicher-Stream verwenden, so dass nicht zurückgegeben werden muss, daher die 0 Bytes in Fiddler.

HttpResponseMessage response = Request.CreateResponse(); 

using (WebClient webClient = new WebClient()) 
{ 
    string url = string.Format(PHOTO_GET, filePath); 
    var memoryStream = new MemoryStream(webClient.DownloadData(url)); 

    response.Headers.AcceptRanges.Add("bytes"); 
    response.StatusCode = HttpStatusCode.OK; 
    response.Content = new StreamContent(memoryStream); 
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("render"); 
    response.Content.Headers.ContentDisposition.FileName = fileName; 
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpg"); 
    response.Content.Headers.ContentLength = memoryStream.Length;    
} 
return response; 
+0

Perfekter Fang, danke! –

+0

Froh, zu helfen. Ich habe meinen Kopf gegen dieses Problem zu oft in der Vergangenheit geknallt, als ich versuchte, PDFs zu erzeugen und das gleiche Bild durch Situationen zu führen. Lebe und lerne. :) – Nkosi

Verwandte Themen