我在我的WCF服务中实现了ClaimsAuthenticaitonManager,以接受来自我们企业ADFS的传入声明,并将其转换为与系统用户相关的声明(如果AD用户未注册为系统的一部分,则生成未经授权的响应)。这些转换后的声明是通过查询应用程序数据库生成的,我想通过在无法访问数据库转换声明的情况下从Authenticate方法返回503状态来解决网络连接问题的可能性。
首先,这是一种合理的方法吗,其次,是否有可能在请求管道中做这样的事情,我该如何处理呢?
答案 0 :(得分:1)
在WCF SOAP服务中执行此操作的正确方法是使用自定义ErrorHandler
。无论您是否使用WIF,都是如此。
自定义错误处理程序实现IErrorHandler
。这允许您的服务抛出异常,这些异常由WCF传递给您注册的自定义错误处理程序。这允许您检查异常并创建适当的错误。
在您的情况下,您可能会抛出来自SQL客户端的异常。除了创建正确的错误之外,您还可以执行任何其他相关操作(例如,通常记录错误)。
IErrorHandler
上的两个方法是
ProvideFault(Exception error, MessageVersion version, ref Message fault)
允许您触发抛出的异常并修改或创建正确的错误。
和
响应返回给客户端后调用的 HandleError(Exception error)
。您可以在此处执行记录错误等操作。
有关如何实现这一点的详细信息,请访问
http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/07/wcf-extensibility-ierrorhandler.aspx
错误处理程序可以使用代码轻松连接,如上面的链接所示。通过一些额外的工作,可以通过实现自定义服务行为扩展来使用web.config进行连接。
可以找到如何执行此操作的示例http://weblogs.asp.net/pglavich/archive/2008/10/16/wcf-ierrorhandler-and-propagating-faults.aspx
尽管如此,通常对于SOAP服务,您不会直接返回HTTP状态代码(即503状态)。相反,您可以将错误包装在FaultException
中并返回。
对于WCF REST,您只需抛出WebFaultException
,webHttpBinding
的内置错误处理程序将处理转换为HTTP错误: