C# 设置ASP.NET中动态创建的图像的内容长度

C# 设置ASP.NET中动态创建的图像的内容长度,c#,asp.net,.net,http,C#,Asp.net,.net,Http,我正在寻找一种简单的方法来设置Http响应中动态创建的图像的内容长度 Response.ContentType = "image/jpeg"; Response.Clear(); Response.BufferOutput = true; ... Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); ... bmp.Save(Response.OutputStream, ImageFormat.Jpeg); Re

我正在寻找一种简单的方法来设置Http响应中动态创建的图像的内容长度

Response.ContentType = "image/jpeg";
Response.Clear();
Response.BufferOutput = true; 
...
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
...
bmp.Save(Response.OutputStream, ImageFormat.Jpeg);
Response.Flush();
正在尝试使用设置内容长度

Response.AddHeader("Content-Length", Response.OutputStream.Length()) 
给出了意想不到的结果

另外,我不希望将文件复制到另一个流(比如MemoryStream)中,然后再次将其复制到输出流中

有什么想法吗



谢谢。

您的HTTP服务器类支持分块编码吗?如果是这样,只需使用它,就不需要设置大小,并且仍然允许连接保持活动状态。@Eden,您必须将图像存储到mem流中并测量内容长度。OTOH,为什么不将映像推送到磁盘上,然后使用Reponse.WriteFile(或TransmitFile)从那里提供服务呢。只有当您必须多次向(可能的)多个用户提供同一映像(本质上是在磁盘上缓存映像)时,这种方法才有意义。@DavidSchwartz-从文档中可以看出IIS 7.5支持分块编码,尽管我在响应头中没有看到这一点。我必须调查这个问题。谢谢@很遗憾,VinayC图像无法缓存在磁盘上,每个响应都是唯一的。您的HTTP服务器类支持分块编码吗?如果是这样,只需使用它,就不需要设置大小,并且仍然允许连接保持活动状态。@Eden,您必须将图像存储到mem流中并测量内容长度。OTOH,为什么不将映像推送到磁盘上,然后使用Reponse.WriteFile(或TransmitFile)从那里提供服务呢。只有当您必须多次向(可能的)多个用户提供同一映像(本质上是在磁盘上缓存映像)时,这种方法才有意义。@DavidSchwartz-从文档中可以看出IIS 7.5支持分块编码,尽管我在响应头中没有看到这一点。我必须调查这个问题。谢谢@不幸的是,VinayC无法将图像缓存在磁盘上,每个响应都是唯一的。这正是我试图避免的事情。你必须这样做。或者,参见@David Schwartz的评论;你没有回应他,没有。有很多选择。例如,我可以编写自己的HttpResponse类来满足我的需要。我们讨论的是现实的解决方案。如果你有时间为这个手工制作自己的
HttpResponse
类,那就去吧。请在这里提交你的课程代码,以方便其他人寻找你问题的解决方案。这个盒子是个好地方。也许解决方案是用另一种替代方法替换位图?说FreeImage()?这正是我试图避免的事情。你必须这样做。或者,参见@David Schwartz的评论;你没有回应他,没有。有很多选择。例如,我可以编写自己的HttpResponse类来满足我的需要。我们讨论的是现实的解决方案。如果你有时间为这个手工制作自己的
HttpResponse
类,那就去吧。请在这里提交你的课程代码,以方便其他人寻找你问题的解决方案。这个盒子是个好地方。也许解决方案是用另一种替代方法替换位图?说FreeImage()?
long bmpByteSize;
using (var ms = new MemoryStream(estimatedLength /* you can instantiate without this parameter at all */))
{
    bmp.Save(ms, ImageFormat.Png);
    bmpByteSize= ms.Length;
}