c# - 永远不会返回 HttpHandler 响应

标签 c# asp.net httphandler

我们有一个相当复杂的 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/

相关文章:

c# - 为什么 C# 为相同的源代码生成不同的 EXE?

c# - 表达式树深度限制

c# - 两个包含接口(interface)的列表与一个包含具有两个接口(interface)的结构的列表

.net - 如何在 ASP.NET MVC 中使用通用处理程序 (ASHX)?

c# - ASP.NET HttpHandler 是否超时

c# - 当我将 OrderBy 放在查询开头时,为什么 EF 会添加大量未使用的 OUTER APPLY 子句

c# - 使用javascript选中复选框启用文本框

asp.net - DotNetNuke 网站迁移到 Azure 失败,出现 nx 域 DNS 错误

asp.net - 是/否/全部是/全部否消息框 asp.net

c# - 使用 HttpHandler 在 ASP.Net 网页中加载缩略图