我有一大堆存储在安全服务器上的图像,其中一些需要在面向世界的门户上显示。门户网站的服务器位于DMZ内部,允许请求但阻止直接请求进入安全域。图像使用SOLR编目,可以通过http://intenalname/folderA/folderAB/file.jpg
在我的PhotoController
内,我可以创建WebClient
的实例,为其提供网址并获取MemoryStream
。如果我尝试使用这个内存流来填充response.content,我会得到一个空响应(每个fiddler)。如果我使用内存流写入本地文件,那么读取文件(使用FileStream和FileInfo)它可以正常工作"正如所料"。
我应该能够从MemoryStream
到StreamContent
而无需通过文件系统(不应该)?但怎么样?
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;
通过Fiddler进行测试时,我得到了:
[Fiddler] ReadResponse()失败:服务器没有返回完整的 响应此请求。服务器返回0个字节。
(通过FileStream时,Fiddler向我显示图片。)
答案 0 :(得分:26)
在您的代码中,内存流在将内容传递给响应之前就会被处理掉。返回的响应将使用已处理的内存流,因此无需返回,因此fiddler中的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;