Wcf 如何在ClaimsAuthenticationManager.Authenticate期间处理错误

Wcf 如何在ClaimsAuthenticationManager.Authenticate期间处理错误,wcf,error-handling,wif,claims-based-identity,http-status-code-503,Wcf,Error Handling,Wif,Claims Based Identity,Http Status Code 503,我已在我的WCF服务中实现了ClaimsAuthenticationManager,以接受来自我们企业ADF的传入索赔,并将其转换为与系统用户相关的索赔(如果AD用户未注册为系统的一部分,则生成未经授权的响应)。这些转换后的声明是通过查询应用程序数据库生成的,如果无法访问数据库转换声明,我想通过从Authenticate方法返回503状态来说明网络连接问题的可能性 首先,这是一种合理的方法吗?其次,在请求管道的这一点上是否可以做这样的事情?我将如何做?在WCF SOAP服务中,正确的方法是使用自

我已在我的WCF服务中实现了ClaimsAuthenticationManager,以接受来自我们企业ADF的传入索赔,并将其转换为与系统用户相关的索赔(如果AD用户未注册为系统的一部分,则生成未经授权的响应)。这些转换后的声明是通过查询应用程序数据库生成的,如果无法访问数据库转换声明,我想通过从Authenticate方法返回503状态来说明网络连接问题的可能性


首先,这是一种合理的方法吗?其次,在请求管道的这一点上是否可以做这样的事情?我将如何做?

在WCF SOAP服务中,正确的方法是使用自定义的
错误处理程序。无论您是否使用WIF,情况都是如此

自定义错误处理程序实现
IErrorHandler
。这允许您的服务抛出异常,这些异常由WCF传递给您注册的自定义错误处理程序。这允许您检查异常并创建适当的故障

在您的例子中,您可能会抛出来自SQL客户机的异常。除了创建正确的故障,您还可以执行任何其他相关操作(例如,通常记录错误)

IErrorHandler
上的两个方法是

ProvideFault(异常错误、MessageVersion、ref Message故障)
允许您输入抛出的异常并修改或创建正确的故障

HandleError(异常错误)
在响应返回到客户端后调用。在这里,您可以执行诸如记录错误之类的操作

有关如何实现此功能的详细信息,请访问

可以使用代码轻松地连接错误处理程序,如上面的链接所示。通过实现一个定制服务行为扩展,只需做一点额外的工作,就可以使用web.config将其连接起来。有关如何执行此操作的示例,请访问

话虽如此,通常对于SOAP服务,您不会直接返回HTTP状态代码(即503状态)。相反,您可以将错误包装在一个
FaultException
中并返回该异常

对于WCF REST,您只需抛出一个
WebFaultException
,而
webHttpBinding
的内置错误处理程序将处理转换为HTTP错误:


在WCF SOAP服务中执行此操作的正确方法是使用自定义的
错误处理程序。无论您是否使用WIF,情况都是如此

自定义错误处理程序实现
IErrorHandler
。这允许您的服务抛出异常,这些异常由WCF传递给您注册的自定义错误处理程序。这允许您检查异常并创建适当的故障

在您的例子中,您可能会抛出来自SQL客户机的异常。除了创建正确的故障,您还可以执行任何其他相关操作(例如,通常记录错误)

IErrorHandler
上的两个方法是

ProvideFault(异常错误、MessageVersion、ref Message故障)
允许您输入抛出的异常并修改或创建正确的故障

HandleError(异常错误)
在响应返回到客户端后调用。在这里,您可以执行诸如记录错误之类的操作

有关如何实现此功能的详细信息,请访问

可以使用代码轻松地连接错误处理程序,如上面的链接所示。通过实现一个定制服务行为扩展,只需做一点额外的工作,就可以使用web.config将其连接起来。有关如何执行此操作的示例,请访问

话虽如此,通常对于SOAP服务,您不会直接返回HTTP状态代码(即503状态)。相反,您可以将错误包装在一个
FaultException
中并返回该异常

对于WCF REST,您只需抛出一个
WebFaultException
,而
webHttpBinding
的内置错误处理程序将处理转换为HTTP错误:


谢谢您的详细回复。今天上午我将对此进行一次尝试。从一般错误处理的角度来看,这种方法非常有用,并且声明转换的具体案例确实经过了处理程序的处理。有些博客有点过时,将IErrorHandler实现为一个非常吸引人的工具。下面列出了一个示例用法。感谢您的详细回复。今天上午我将对此进行一次尝试。从一般错误处理的角度来看,这种方法非常有用,并且声明转换的具体案例确实经过了处理程序的处理。有些博客有点过时,将IErrorHandler实现为一个非常吸引人的工具。下面列出了一个示例用法。