gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:07:13 26 4
gpt4 key购买 nike

我在安全服务器上存储了大量图像,其中一些图像需要在面向世界的门户网站上显示。门户网站的服务器位于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com