2

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

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

  1. Context.Response.End(); 总是在 500-status-code 响应中向调用者返回一个 ThreadAborted 异常。即使我在调用 End() 之前明确设置了 Context.Response.StatusCode = 401,它也会被忽略。结果仍然是 500 响应,并且消息始终是“线程中止异常”。
  2. MSDN建议我改用 HttpContext.Current.ApplicationInstance.CompleteRequest() 。但是,这不会停止下游处理:我的子类的函数仍然执行,就好像构造函数什么也没做一样。(有点违背了在构造函数中检查授权的目的。)
  3. 我可以抛出一个新的 HttpException。这稍微好一点,因为它确实阻止了下游处理,并且至少它让我可以控制返回给调用者的异常消息。但是,它并不完美,因为响应始终是 500。
  4. 我可以定义一个 DoProcessing 实例 var,并在构造函数中将其设置为 true/false。然后让每个子类中的每个 WebMethod 将其功能包装在一个 if (DoProcessing) 块中……但是让我们面对现实吧,这太可怕了!

有没有更好/更彻底的方法来实现这种功能,所以它对我所有的 ASMX 类都很常见?

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

4

2 回答 2

0

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

如果您仍然必须使用 ASMX,那么最好的办法是从每个 Web 方法调用基类方法。您可能想使用 PostSharp 之类的东西“神奇地”使您的所有 Web 方法调用基类方法。

于 2010-07-12T22:01:32.207 回答
0
 Context.Response.Write("My custom response message from constructor");
 Context.Response.StatusCode = (int)HttpStatusCode.Forbidden;       
 Context.Response.End();

该代码阻止在构造函数之后传入 web 方法。

于 2017-04-05T17:47:52.413 回答