C# 使用IHttpHandler提供图像

C# 使用IHttpHandler提供图像,c#,ihttphandler,C#,Ihttphandler,我正在使用一个仅在我们内部网络上可用的web服务器。我需要通过我们的DMZ网络服务器向公众提供它提供的图像。内部系统有一个GUI,任何人都可以上传任何类型的图像,因此我的HttpHandler必须灵活 我当前使用的代码位是: WebResponse webResponse = WebRequest.Create(imagePath).GetResponse(); using (Stream stream = webResponse.GetResponseStream()) { conte

我正在使用一个仅在我们内部网络上可用的web服务器。我需要通过我们的DMZ网络服务器向公众提供它提供的图像。内部系统有一个GUI,任何人都可以上传任何类型的图像,因此我的HttpHandler必须灵活

我当前使用的代码位是:

WebResponse webResponse = WebRequest.Create(imagePath).GetResponse();
using (Stream stream = webResponse.GetResponseStream())
{
    context.Response.Clear();
    context.Response.ContentType = webResponse.ContentType;
    stream.CopyTo(context.Response.OutputStream);
    context.Response.End();
}
这似乎很有效,它可以在HTML页面上正确地显示图像,但当我在Chrome中右键单击并选择“在新选项卡中打开图像”时,我会得到如下乱码文本:

有什么建议可以让我的代码变得更好吗

谢谢


编辑:看起来这段代码片段正是它应该做的。问题在于内部托管的映像本身。甚至在运行此HttpHandler之前,它就提供了完全相同的乱码文本。

您的内容类型标题可能没有正确设置


将其更改为
context.Response.ContentType=“image/png”,但将“png”替换为您正在加载的任何图像时间。

您的内容类型标题可能未正确设置


将其更改为
context.Response.ContentType=“image/png”,但将“png”替换为您正在加载的任何图像时间。

尽可能多地在响应标题中添加信息<当没有HTML为内容提供任何上下文时,代码>内容类型
对于获取要显示的图像至关重要。缓存标头将防止浏览器反复下载相同的资源。我从内部服务器获取的imagePath没有文件扩展名,它也是一个HttpHandler,它只为具有正确QueryString参数的图像提供服务。这就是为什么我想设置context.Response.ContentType=webResponse.ContentType;这是正确的解决方案。将整个输出流复制到我的响应中是否会添加它自己的ContentType,然后我会添加两次?@BerinLoritsch,这也是OP应该遵循的合理建议。@JaredFeldman,最常见的图像类型(JPG、GIF和PNG)它们都有神奇的字节,可以识别图像在最初几个字节内的内容。如果您可以提前查看流,就可以确定内容类型。当然,这是假设webResponse.ContentType设置不正确(看起来不正确)。只有一个ContentType,因此在开始复制流的内容之前,您可以根据需要多次更改它。请尽可能多地向响应标题添加信息<当没有HTML为内容提供任何上下文时,代码>内容类型
对于获取要显示的图像至关重要。缓存标头将防止浏览器反复下载相同的资源。我从内部服务器获取的imagePath没有文件扩展名,它也是一个HttpHandler,它只为具有正确QueryString参数的图像提供服务。这就是为什么我想设置context.Response.ContentType=webResponse.ContentType;这是正确的解决方案。将整个输出流复制到我的响应中是否会添加它自己的ContentType,然后我会添加两次?@BerinLoritsch,这也是OP应该遵循的合理建议。@JaredFeldman,最常见的图像类型(JPG、GIF和PNG)它们都有神奇的字节,可以识别图像在最初几个字节内的内容。如果您可以提前查看流,就可以确定内容类型。当然,这是假设webResponse.ContentType设置不正确(看起来不正确)。只有一个ContentType,因此在开始复制流的内容之前,可以根据需要多次更改它。