2016-05-04 21 views
12

Bazıları dünyaya bakan bir portalda görüntülenmesi gereken güvenli bir sunucuda saklanan büyük bir resim koleksiyonum var. Portalın sunucusu, isteklere izin veren ancak doğrudan isteklerin güvenli alan adından geçmesini engelleyen bir DMZ'nin içinde. görüntüleri solr kullanılarak kategorize edilmiş ve ben WebClient bir örneğini oluşturmak o url vermek ve bir MemoryStream alabilirsiniz benim PhotoController İçinde http://intenalname/folderA/folderAB/file.jpgWeb API Denetleyicisi, MemoryStream'i StreamContent'e dönüştürür

bir iç (apache?) sunucusu üzerinden indirilebilir. Response.content'i doldurmak için bu bellek akışını kullanmaya çalışırsam boş bir yanıt alır (kemancı başına). Yerel bir dosyaya yazmak için bellek akışını kullanırsam, dosyayı (FileStream ve FileInfo kullanarak) okuyun ve "beklendiği gibi" çalışır.

Dosya sisteminden geçmeden MemoryStream - StreamContent arasında olmalıdır (olmalıdır)? ama nasıl? StreamContent(stream) için varsayılan kurucu, derleyici hatası olmadan bellek akışı örneğini kabul eder ... ancak yalnızca 'çalışmıyor'. Fiddler yoluyla test ederken

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; 

alıyorum:

[Fiddler] ReadResponse() başarısız oldu: Sunucu bu istek için tam bir yanıtı dönmedi. Sunucu 0 bayt döndürdü. buna yanıt içerik var geçebilir önce (FileStream Fiddler geçiyor bana görüntüsünü gösterir.)

+0

Yorumlanan çıkış kodunda yaptığınız gibi 'memoryStream.Position 'değerini 0'a sıfırlamayı denediniz mi? – itsme86

+0

denediğim birçok şeyden biri ... sevinç yok, teşekkürler –

cevap

16

Kodunuzda bellek akışı bertaraf ediliyor. Döndürülmüş yanıt, atılacak bir bellek akışı kullanacaktır, bu nedenle geri dönme zorluğu vardır, dolayısıyla kemancıda 0 bayt.

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

Mükemmel yakalama, teşekkürler! –

+0

Yardımlardan memnun oldum. PDF'leri oluşturmaya çalıştığınızda ve aynı görüntülerin durumlarını geçtiğinde, geçmişte çok fazla sorun yaşadım. Yaşa ve öğren. :) – Nkosi