2010-07-12 38 views
2

我有一个通用的基类,我的所有ASMX webservice类将从其继承。在构造函数中,我想做一些常见的身份验证检查;如果它们失败了,我想立即停止处理(子类的代码不会被执行),并向调用者返回401状态码响应。如何根据构造函数中的逻辑中止ASMX请求?

然而,似乎这样做的共同ASPX样的方式不工作:

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

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

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

回答

0

做到这一点的最佳方法是切换到WCF,该WCF明确支持这种情况。

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

+0

我们决定针对这个系统使用WCF,因为它将托管在不同的系统上,因此所有对它的调用都会受到XSS限制。 JSONP可以解决这个问题,但它有自己的一套限制(仅限GET模式,没有从原始的asp.net服务器传播cookie等)。 WCF访问需要安全,所以我们需要解决JSONP-cookie限制,然后在WCF服务和asp.net服务之间建立单点登录机制。所有这些都不是无法克服的,但ASMX似乎是更实用的方法。 – mikemanne 2010-07-22 20:33:47

+0

@mike:在不同的系统上托管WCF服务的原因是什么?为什么不把它放在与ASMX服务完全相同的地方,并以完全相同的方式运行? – 2010-07-22 21:18:40

0
Context.Response.Write("My custom response message from constructor"); 
Context.Response.StatusCode = (int)HttpStatusCode.Forbidden;  
Context.Response.End(); 

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

相关问题