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.jpg
Web 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.)
Haben Sie versucht, 'memoryStream.Position' auf 0 zurückzusetzen, wie Sie es im auskommentierten Code tun? – itsme86
das ist eines der vielen Dinge, die ich ausprobiert habe ... keine Freude, danke aber –