代码之家  ›  专栏  ›  技术社区  ›  mikemanne

如何基于构造函数中的逻辑中止ASMX请求?

  •  2
  • mikemanne  · 技术社区  · 14 年前

    我有一个公共基类,我的所有asmxwebservice类都将从中继承。在构造函数中,我想做一些常见的身份验证检查;如果失败,我想立即停止处理(子类的代码不会被执行),并向调用者返回401状态代码响应。

    但是,常见的类似ASPX的方法似乎不起作用:

    1. Context.Response.End();总是在500状态码响应内将ThreadAborted异常回退给调用方。即使在调用End()之前显式设置Context.Response.StatusCode=401,它也会被忽略。结果仍然是500响应,消息总是“thread aborted exception”。
    2. MSDN 建议改用HttpContext.Current.ApplicationInstance.CompleteRequest()。然而,这并没有停止下游处理:我的子类的函数仍然被执行,就好像构造函数什么也没做一样(有点违背了在构造函数中检查授权的目的。)
    3. 我可以抛出一个新的HttpException。这样做更好一点,因为它确实阻止了下游处理,至少它让我可以控制返回给调用方的异常消息。然而,它并不完美,因为响应仍然是500。

    有没有更好/更彻底的方法来实现这类功能,所以它对我所有的ASMX类都是通用的?

    :接受约翰的回答,因为这可能是最好的方法。然而,由于客户不愿意采用额外的第三方代码,以及AOP的某种程度的FUD,我们没有采取这种方法。我们最终选择了上面的选项3,因为它似乎在实现速度和灵活性之间取得了最佳平衡,并且仍然满足了需求。

    2 回复  |  直到 14 年前
        1
  •  0
  •   John Saunders    14 年前

    最好的方法是切换到WCF,它对这种场景有明确的支持。

    如果您仍然必须使用ASMX,那么最好的办法是从每个web方法调用基类方法。您可能希望使用PostSharp之类的工具“神奇地”使所有web方法都调用基类方法。

        2
  •  0
  •   Luar Faria    8 年前
     Context.Response.Write("My custom response message from constructor");
     Context.Response.StatusCode = (int)HttpStatusCode.Forbidden;       
     Context.Response.End();