ASP.NET Web API返回图像

时间:2014-02-05 18:27:04

标签: c# asp.net-web-api

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

搜索解决方案后,大多数示例建议使用HttpResponseMessage并正确设置Content和Content-Type标头。例如,在以下帖子中: WebApi: How to handle Images ASP .Net Web API downloading images as binary

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

    [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上,该方法有多个调用。有时两次有时3次。我对此没有任何解释。除了浏览器没有显示图像之外,我没有得到任何我能检测到的错误。

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

3 个答案:

答案 0 :(得分:2)

这为我解决了问题WebApi: How to handle Images

简而言之

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

答案 1 :(得分:0)

我最近在我的项目中使用了这个:

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;

resource [“file”]是一个包含文件流对象的数组。

希望这有帮助。

答案 2 :(得分:0)

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

var result = new HttpResponseMessage(HttpStatusCode.OK);    
String filePath = HostingEnvironment.MapPath("~/Images/123.jpg");
FileStream fileStream = new FileStream(filePath, FileMode.Open);
Image image = Image.FromStream(fileStream);
MemoryStream memoryStream = new MemoryStream();
image.Save(memoryStream, ImageFormat.Jpeg);
var byteArrayContent = new ByteArrayContent(memoryStream.ToArray());
byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
result.Content = byteArrayContent;
return result;