大量の画像をセキュリティで保護されたサーバーに格納していますが、そのうちのいくつかは世界のポータルに表示する必要があります。ポータルのサーバーはDMZ内にあり、DMZ内の要求を許可しますが、ダイレクト要求がセキュリティ保護されたドメインに移動することはできません。画像はSOLRを使用してカタログされていると私は、WebClient
のインスタンスを作成し、それにURLを与えるとMemoryStream
を得ることができ、私のPhotoController
内部http://intenalname/folderA/folderAB/file.jpg
Web 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をバイオリンを通過すると、私のイメージを示しています。)
コメントアウトされたコードのように 'memoryStream.Position'を0にリセットしようとしましたか? – itsme86
私が試した多くの事の一つです...喜びはありませんが、ありがとう –