我有一个公共基类,我的所有 ASMX Web 服务类都将从该基类继承。在构造函数中,我想做一些常见的身份验证检查;如果他们失败了,我想立即停止处理(子类的代码不会被执行)并向调用者返回一个 401-status-code 响应。
但是,常见的类似 ASPX 的方法似乎不起作用:
- Context.Response.End(); 总是在 500-status-code 响应中向调用者返回一个 ThreadAborted 异常。即使我在调用 End() 之前明确设置了 Context.Response.StatusCode = 401,它也会被忽略。结果仍然是 500 响应,并且消息始终是“线程中止异常”。
- MSDN建议我改用 HttpContext.Current.ApplicationInstance.CompleteRequest() 。但是,这不会停止下游处理:我的子类的函数仍然执行,就好像构造函数什么也没做一样。(有点违背了在构造函数中检查授权的目的。)
- 我可以抛出一个新的 HttpException。这稍微好一点,因为它确实阻止了下游处理,并且至少它让我可以控制返回给调用者的异常消息。但是,它并不完美,因为响应始终是 500。
- 我可以定义一个 DoProcessing 实例 var,并在构造函数中将其设置为 true/false。然后让每个子类中的每个 WebMethod 将其功能包装在一个 if (DoProcessing) 块中……但是让我们面对现实吧,这太可怕了!
有没有更好/更彻底的方法来实现这种功能,所以它对我所有的 ASMX 类都很常见?
编辑:接受约翰的回答,因为这可能是最好的方法。但是,由于客户不愿意采用额外的第 3 方代码,以及 AOP 的某种程度的 FUD,我们没有采用这种方法。我们最终选择了上面的选项 #3,因为它似乎在实现速度和灵活性之间取得了最佳平衡,并且仍然满足要求。