2016-05-04 2 views
12

大量の画像をセキュリティで保護されたサーバーに格納していますが、そのうちのいくつかは世界のポータルに表示する必要があります。ポータルのサーバーはDMZ内にあり、DMZ内の要求を許可しますが、ダイレクト要求がセキュリティ保護されたドメインに移動することはできません。画像はSOLRを使用してカタログされていると私は、WebClientのインスタンスを作成し、それにURLを与えるとMemoryStreamを得ることができ、私のPhotoController内部http://intenalname/folderA/folderAB/file.jpgWeb APIコントローラーMemoryStreamをStreamContentに変換します

から内部(apacheの?)サーバー経由でダウンロードすることができます。このメモリストリームを使用してresponse.contentにデータを格納しようとすると、空のレスポンスが返されます。メモリストリームを使用してローカルファイルに書き込む場合は、FileStreamとFileInfoを使用してファイルを読み込み、「期待どおりに」動作します。

私はMemoryStreamからStreamContentにファイルシステムを経由することなく(Iではない)得ることができますか?しかしどのように? StreamContent(stream)のデフォルトのコンストラクタは、コンパイルエラーなしでメモリストリームインスタンスを受け入れますが、単に動作しません。

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; 

フィドラーを経由してテストする際に私が取得:

[フィドラー] ReadResponse()が失敗しました:サーバーは、この要求のための完全な 応答を返しませんでした。サーバーは0バイトを返しました。それが応答にコンテンツです渡すことができます前に、(FileStreamをバイオリンを通過すると、私のイメージを示しています。)

+0

コメントアウトされたコードのように 'memoryStream.Position'を0にリセットしようとしましたか? – itsme86

+0

私が試した多くの事の一つです...喜びはありませんが、ありがとう –

答えて

16

あなたのコードでは、メモリストリームが配置されています。返されたレスポンスは、廃棄されたメモリストリームを使用して返されることはないため、0バイトのフィドラーが返されます。

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

完璧なキャッチ、ありがとう! –

+0

喜んで助けてください。過去にPDFを生成するtryignと同じイメージが状況を通り過ぎると、私はその問題のやり方に対して頭を抱えていました。生活し、学びます。 :) – Nkosi

関連する問題