c# - Web API Controller 将 MemoryStream 转换为 StreamContent

标签 c# asp.net stream asp.net-web-api2

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

下载

在我的 PhotoController 中,我可以创建一个 WebClient 的实例,为它提供 url 并获取一个 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() failed: The server did not return a complete response for this request. Server returned 0 bytes.

(当通过 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;

关于c# - Web API Controller 将 MemoryStream 转换为 StreamContent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37035606/

相关文章:

javascript - jquery 自动完成文本框不适用于使用 ASP.NET 的更新面板

c# - 格式化货币值的更有效方法

ios - 通过 MPMoviePlayer 流式传输带有凭据的大型电影

c# - 如何获得影响其输出的表达式树的所有因素

c# - Entity Framework 核心 - 不在

c# - 如何将 viewbag 显示为 html?

c# - 无法使用 BinaryWriter 写入 MemoryStream

c# - HttpClient 不使用 .NET Core 在 Windows 上发送客户端证书

c# - 该进程无法访问该 exe 文件,因为它正被另一个进程使用

c# - 从流中播放 MP3