ASP.NET Web API 返回图像

cwi*_*man 3 c# asp.net-web-api

我一直在尝试使用 ASP.NET Web API 返回图像。我见过很多例子,但我不断遇到问题。

\n\n

在搜索解决方案后,大多数示例建议使用 HttpResponseMessage 并正确设置 Content 和 Content-Type 标头。例如,在以下帖子中:\n WebApi:如何处理图像 ASP .Net Web API 将图像下载为二进制文件

\n\n

这就是我现在正在做的事情:

\n\n
    [System.Web.Http.HttpGet]\n    [ActionName("ConvertHTMLToImage")]\n    public HttpResponseMessage ConvertHTMLToImage(string htmlString)\n    {\n        var path = @"C:\\temp\\mona-lisa.png";\n        var response = Request.CreateResponse(HttpStatusCode.OK);\n        var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);\n        response.Content = new StreamContent(fileStream);\n        response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");\n        return response;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到的结果好坏参半。当我访问该资源的 URL 时,我遇到了 Chrome(此网页不可用)、Firefox(连接已重置)和 Safari(Safari 无法打开该页面)的问题。令我惊讶的是,它在 IE 中运行得很好。我还可以使用 Fiddler 中的作曲家成功查看图像。如果我保持 Fiddler 打开并使用 Chrome/Firefox/Safari 访问资源,我会看到 504 错误。不确定这意味着什么,我不记得以前见过该错误类型。

\n\n

我还注意到调试器中的浏览器无法正常工作时出现一些奇怪的行为。如果我从 IE 和 Fiddler 调用 ConvertHTMLToImage,我会看到它在断点处停止一次,然后图像成功返回给客户端。在 Chrome/Firefox/Safari 上,该方法有多个调用。有时两次有时3次。对此我没有任何解释。除了浏览器不显示图像之外,我没有收到任何可以检测到的错误。

\n\n

我已经使用 aspx 页面、HttpHhandlers 和其他 .NET 方法完成了同样的事情,所以我知道有解决方法,但我真的很想知道我做错了什么。这看起来应该可以使用 Web API 轻松完成。

\n

Pab*_*tyk 5

这为我解决了 WebApi 的问题:如何处理图像

简而言之

[System.Web.Http.HttpGet]
[ActionName("ConvertHTMLToImage")]
public HttpResponseMessage ConvertHTMLToImage()
{  
     string filePath = @"C:\temp\mona-lisa.png";

     var result = new HttpResponseMessage(HttpStatusCode.OK);

     FileStream fileStream = new FileStream(filePath, FileMode.Open);
     Image image = Image.FromStream(fileStream);
     MemoryStream memoryStream = new MemoryStream();
     image.Save(memoryStream, ImageFormat.Jpeg);

     result.Content = new ByteArrayContent(memoryStream.ToArray());
     result.Content.Headers.ContentType = new  MediaTypeHeaderValue("image/jpeg");
     return result;
}
Run Code Online (Sandbox Code Playgroud)