Web API控制器将MemoryStream转换为StreamContent



我在一个安全的服务器上存储了大量图像,其中一些图像需要显示在面向世界的门户网站上。门户网站的服务器位于DMZ内,DMZ允许请求进入,但阻止直接请求进入安全域。图像使用SOLR编目,可以通过内部(apache?)服务器从http://intenalname/folderA/folderAB/file.jpg 下载

在我的PhotoController中,我可以创建WebClient的一个实例,给它url并获得一个MemoryStream。如果我试图使用这个内存流来填充response.content,我会得到一个空响应(每个fiddler)。如果我使用内存流写入本地文件,然后读取文件(使用FileStream和FileInfo),它会"按预期"工作。

我应该能够在不经过文件系统的情况下从MemoryStreamStreamContent(不是吗)??但是如何?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会向我显示图像。)

在您的代码中,内存流在将其内容传递给响应之前已被处理。返回的响应将使用已处理的内存流,因此没有任何内容可返回,因此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;

相关内容

  • 没有找到相关文章

最新更新