1

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

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

4

1 回答 1

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 状态)。相反,您会将错误包装在 a 中FaultException并返回。

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

http://blogs.msdn.com/b/endpoint/archive/2010/01/21/error-handling-in-wcf-webhttp-services-with-webfaultexception.aspx

于 2013-09-29T18:29:25.060 回答