我们有一个相当复杂的 httphandler 来处理图像。基本上它以请求的任何大小流式传输图像的任何部分。一些客户使用这个处理程序没有任何问题。但是我们有一个位置给我们带来了问题,现在它也给我的开发环境带来了问题。
发生的情况是客户端在某些请求中从未收到任何东西。所以请求 1 和 2 没问题,但请求 3 和 4 永远不会结束。
- 调试时我可以看到服务器已准备就绪并已完成请求。
- 然而,客户端仍在等待结果(使用 fiddler2 进行调试显示没有收到响应)
我们用来流式传输图像的代码是
if (!context.Response.IsClientConnected)
{
imageStream.Close();
imageStream.Dispose();
return;
}
context.Response.BufferOutput = true;
context.Response.ContentType = "image/" + imageformat;
context.Response.AppendHeader("Content-Length", imageStream.Length.ToString());
if (imageStream != null && imageStream.Length > 0 && context.Response.IsClientConnected)
context.Response.BinaryWrite(imageStream.ToArray());
if (context.Response.IsClientConnected)
context.Response.Flush();
imageStream.Close();
imageStream.Dispose();
imageStream 是一个包含图像内容的 MemoryStream。
在调用 response.Flush() 之后,我们会做更多的清理工作并将摘要写入事件日志。
我们还在每次请求后调用 GC.Collect(),因为我们在内存中使用的对象变得非常大。我知道这不是一个好的做法,但这会给我们带来麻烦吗?
不返回请求的问题在 IIS 5 (Win XP) 和 IIS 6 (Win 2003) 上都会发生,我们使用.NET framework v2。
最佳答案
首先,有更好的方法来处理整个流使用数组(即 MemoryStream
可能 在这里是不必要的)。
我会设想一个循环:
const int BUFFER_SIZE = 4096; // pick your poison
bute[] buffer = new byte[BUFFER_SIZE];
int bytesRead;
while((bytesRead = inStream.Read(buffer, 0, BUFFER_SIZE)) > 0)
{
outStream.Write(buffer, 0, bytesRead);
}
您还应该在禁用缓冲的情况下执行此操作 (.Response.BufferOutput = false
)。
关于问题,我怀疑您没有写入足够的数据/关闭响应 (.Response.Close()
)。
关于c# - 永远不会返回 HttpHandler 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/280426/