2011-07-06 69 views
1

我正在使用消费WCF服务的客户端。在各种情况下,服务只是通过相关的消息引发FaultException,通知给出的故障背后的原因。处理WCF故障

这些错误中有一些是我们的客户端应用程序可以处理的东西,但是我只是在FaultExceptions消息或Reason中执行一些字符串匹配而不是犹豫,以确定它是否可以满足我们的要求。

我希望FaultException上的FaultCode可以用来识别我们可以处理的特定类型的Fault,但看起来这纯粹是为了识别一些SOAP错误。如果我对此的解释不正确,请纠正我。

我知道它可能会引发FaultException,但我认为期望为出现故障后的每个原因创建新类型是不现实的。

你如何处理这种情况。作为一个人为的例子。考虑提供以下方法的服务;

RecordDetails GetRecordById(string id) 

void Add(RecordDetails record) 

void Update(RecordDetailsUpdateRequest rdur) 

现在,在上面的例子,如果你调用GetRecordById与不存在的ID,您收到的FaultException与说明消息“记录无法找到”。同样,如果您为已存在的记录调用Add或为不存在的记录调用Update,则只需通过Message/Reason详细说明失败原因即可获得FaultException。我需要知道是否存在记录,以确定是否应更新或插入。正如我所提到的,由于我无法控制它们是否会保持不变,所以我很犹豫是否仅仅匹配字符串。

在这种情况下(与FaultException有关的类型详述了RecordNotFoundException等)或与FaultException相关的一些泛型类型会定义与错误相关的特定细节,您会期望什么呢?例如,带有成员代码的RecordOperationExcpetion类(失败原因的常量或枚举标识符)以及用户友好的消息。

至少这样,我可以识别错误原因而不必求助于字符串匹配。

您的想法值得赞赏。

回答

2

我会和你上面说的一样 - 与FaultException关联的类型。您可以创建任意数量的表示为DataContract的类来处理各种故障,然后将它们分配给WCF服务操作。

[DataContract] 
public class RecordOperationException 
{ 
    private int code; 
    private string message; 

    [DataMember] 
    public int Code 
    { 
     get 
     { 
      return code; 
     } 
     set 
     { 
      code = value; 
     } 
    } 

    [DataMember] 
    public string Message 
    { 
     get 
     { 
      return message; 
     } 
     set 
     { 
      message = value; 
     } 
    } 
} 

然后,你可以指定这个类作为FaultException类型:

[OperationContract] 
[FaultContract(typeof(RecordOperationException))] 
RecordDetails GetRecordById(string id) 

[OperationContract] 
[FaultContract(typeof(RecordOperationException))] 
void Add(RecordDetails record) 

[OperationContract] 
[FaultContract(typeof(RecordOperationException))] 
void Update(RecordDetailsUpdateRequest rdur) 

然后,您可以抛出相应的FaultException在你的方法,根据需要。

这将消除比较字符串的需要(这是一个好主意,IMO)。

+0

这当然是我的直觉,但我只是热衷于找出更有经验的从业者在过去所做的那样(这仍然是相当新的给我)。不幸的是,我无法控制服务中的功能。但是,如果我可以提供一些很好的例子,说明为什么它应该以特定的方式完成,那么它将有希望让我们所有的生活变得更容易。感谢您的输入:) –

+0

@Mr Moose - 我自己并不是专家,但就我所知,上述FaultContracts是最佳实践。以下是一些可能为您进一步阐述的链接:[指定和处理合同和服务中的错误](http://msdn.microsoft.com/zh-cn/library/ms733721.aspx),[WCF中的异常处理故障合同](http://www.c-sharpcorner.com/UploadFile/ankithakur/ExceptionHandlingWCF12282007072617AM/ExceptionHandlingWCF.aspx),[Fault Contract](http://www.wcftutorial.net/Fault-Contract.aspx)。 – Tim

0

总是使用FaultExceptions并将它们作为OperationContract的一部分公布,如代码所示。

但是,我认为还有比这更多的东西。

我们都知道,关注点的分离是一件好事,您可以通过您的服务实现此目标的方式是创建实现IErrorHandler的类。

这些可以用于你的类,你的错误处理可以从你的逻辑中分离出来,这是一个更清晰的方法。这也意味着您不必在整个代码中重复相同的块。

这也可以与一般的FaultException一起使用。

一个很好的资源是:http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.aspx