C# 返回图像的ASP.NET Web API

C# 返回图像的ASP.NET Web API,c#,asp.net-web-api,C#,Asp.net Web Api,我一直在尝试使用ASP.NETWebAPI返回图像。我看过很多例子,但我总是遇到问题 在搜索解决方案后,大多数示例建议使用HttpResponseMessage并正确设置内容和内容类型标题。例如,在以下职位: 以下是我现在正在做的: [System.Web.Http.HttpGet] [ActionName("ConvertHTMLToImage")] public HttpResponseMessage ConvertHTMLToImage(string htmlSt

我一直在尝试使用ASP.NETWebAPI返回图像。我看过很多例子,但我总是遇到问题

在搜索解决方案后,大多数示例建议使用HttpResponseMessage并正确设置内容和内容类型标题。例如,在以下职位:

以下是我现在正在做的:

    [System.Web.Http.HttpGet]
    [ActionName("ConvertHTMLToImage")]
    public HttpResponseMessage ConvertHTMLToImage(string htmlString)
    {
        var path = @"C:\temp\mona-lisa.png";
        var response = Request.CreateResponse(HttpStatusCode.OK);
        var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
        response.Content = new StreamContent(fileStream);
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
        return response;
    }
我得到的结果好坏参半。当我访问该资源的URL时,我发现Chrome(此网页不可用)、Firefox(连接已重置)和Safari(Safari无法打开页面)存在问题。令我惊讶的是,它在IE中工作得很好。我还可以使用Fiddler中的作曲家成功地查看图像。如果我打开Fiddler并使用Chrome/Firefox/Safari访问资源,我会看到504个错误。不知道这是什么意思,我记不起以前见过这种错误类型

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


我使用aspx页面、HttpHHandler和其他.NET方法做过同样的事情,所以我知道有解决办法,但我真的很想知道我做错了什么。这似乎是应该使用Web API轻松完成的事情。

我最近在项目中使用了这一点:

public HttpResponseMessage Get(int IRN)
        {
            try
            {
                Multimedia image = new Multimedia();
                MemoryStream imageStream = image.GetMedia(IRN);
                HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
                response.Content = new StreamContent(imageStream);
                response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg");
                return response;
            }
            catch (Exception ex)
            {
                return HandleError(ex);           
            }

        }

GetMedia function:

    .....
                MemoryStream mediaStream = new MemoryStream();
    ...
    FileStream temp = resource["file"] as FileStream;
                            mediaStream.SetLength(temp.Length);
                            temp.Read(mediaStream.GetBuffer(), 0, (int)temp.Length);

                            temp.Close();
....

  return mediaStream;
资源[“文件”]是包含filestream对象的数组

希望这有帮助。

试试这个(根据需要用png替换jpg):


这为我解决了这个问题

总之

[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;
}

可能先尝试将文件从
文件流
读取到
字节[]缓冲区
数组中,然后关闭文件流,打开带有缓冲区内容的
内存流
,然后将其传递到响应流。我尝试了这一操作和其他变体,但也遇到了同样的问题。不过,它似乎与未终止的流有关。我看过几篇文章讨论了底层基础设施应该如何关闭/处理HttpResponseMessage,但我没有找到任何相关文档。希望我能找到一些。我做了一个样本测试项目,它似乎能正确显示图像(除了IE希望下载图像而不是显示图像)。要确保它是否与流相关,请尝试将文件读取到
字节[]
缓冲区,并使用
ByteArrayContent
,如下所述:.Hmmm。我尝试了几乎完全相同的事情。唯一的区别是我使用了Image img=Image.FromFile(path);而不是图像img=GetImage(图像名称、宽度、高度);我仍然有同样的问题。我想知道到底是什么原因导致了这么多的请求。你有没有找到这个问题的原因?我也有同样的问题,并且已经花了几个小时试图解决它。这基本上就像我正在做的。但是,当您在浏览器中转到web方法的URL时会发生什么?我希望能够浏览到我的资源。在IE中它可以工作,但在任何其他浏览器中都不行。
[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;
}