【问题标题】:How can I cleanly terminate HTTP Transaction in OnBeginRequest?如何在 OnBeginRequest 中干净地终止 HTTP 事务?
【发布时间】:2019-08-20 15:57:28
【问题描述】:

我正在编写一个带有 HTTP 接口的普通事务处理器。客户端在 POST 正文中发布交易详情。

我真正需要的是 OnBeginRequest 处理程序。当我到达这个事件的底部时,我已经完成了。无需继续在服务器上进行 IIS 管道处理。

所以我在底部放了一个 Response.End 。这“有效”,但它确实引发了一个异常,我只是捕获并抑制它。

  1. 我是否应该从性能或质量的角度关注这一点?

  2. 有什么方法可以更干净地完成这个任务吗?

    private void OnBeginRequest(object sender, EventArgs e)
    {
        HttpContext ctx = HttpContext.Current;
    
        try
        {
            if (ctx.Request.RequestType == "POST" && ctx.Request.IsSecureConnection)
            {
                // Here's where processing is implemented...
    
               ctx.Response.StatusCode = 200;
               ctx.Response.Write("OK");
            }
            else
            {
               ctx.Response.StatusCode = 403;
               ctx.Response.Write("BAD");
            }
        }
        catch (Exception ex)
        {
            ctx.Response.StatusCode = 500;
            ctx.Response.Write("ERROR");
        }
    
        try
        {
            ctx.Response.End();
        }
        catch { }
    }
    

【问题讨论】:

  • 在我看来,这是使用 Response.End 终止请求的唯一方法。您可以尝试的另一件事是HttpContext.Current.ApplicationInstance.CompleteRequest(); 这将结束对请求的所有进一步处理。您的处理程序不是管道中唯一的处理程序,因此这将取消您之后对其他处理程序的进一步处理并立即将响应发送给客户端。 link
  • Jalpa - 你提出的实际上是我正在寻找的答案。它完美地工作!我还在stackoverflow.com/questions/365249/… 上找到了这个建议,我正要去这里回答我自己的问题,我看到你打败了我。如果您将此作为答案发布,我将很乐意接受此作为我问题的答案。谢谢!

标签: iis httpmodule


【解决方案1】:

在我看来,这是使用 Response.End 终止请求的唯一方法。您可以尝试的另一件事是 HttpContext.Current.ApplicationInstance.CompleteRequest();这将结束对请求的所有进一步处理。您的处理程序不是管道中唯一的处理程序,因此这将取消您之后的其他处理程序的进一步处理并立即将响应发送到客户端。

HttpApplication.CompleteRequest Method

【讨论】:

  • 绝对! ApplicationInstance.CompleteRequest() 是我现在正在使用的,它运行良好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
相关资源
最近更新 更多