我在我的 WCF 服务中实现了 ClaimsAuthenticaitonManager 以接受来自我们企业 ADFS 的传入声明并将它们转换为与系统用户相关的声明(或者如果 AD 用户未注册为系统的一部分,则生成未经授权的响应)。这些转换后的声明是通过查询应用程序数据库生成的,如果无法访问数据库以转换声明,我想通过从 Authenticate 方法返回 503 状态来解决网络连接问题的可能性。
首先,这是一种合理的方法,其次,是否可以在请求管道的这一点上做这样的事情,我将如何去做?
我在我的 WCF 服务中实现了 ClaimsAuthenticaitonManager 以接受来自我们企业 ADFS 的传入声明并将它们转换为与系统用户相关的声明(或者如果 AD 用户未注册为系统的一部分,则生成未经授权的响应)。这些转换后的声明是通过查询应用程序数据库生成的,如果无法访问数据库以转换声明,我想通过从 Authenticate 方法返回 503 状态来解决网络连接问题的可能性。
首先,这是一种合理的方法,其次,是否可以在请求管道的这一点上做这样的事情,我将如何去做?
在 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 状态)。相反,您会将错误包装在 a 中FaultException
并返回。
对于 WCF REST,您只需抛出一个WebFaultException
并且内置的错误处理程序webHttpBinding
将处理转换为 HTTP 错误: