处理WCF故障

时间:2011-07-06 02:18:59

标签: wcf faultexception

我正在使用正在使用WCF服务的客户端。在各种情况下,服务仅使用关联消息引发FaultException,通知给定故障背后的原因。

这些错误中的一些是我们的客户端应用程序可以处理的事情,但是我只是想在FaultExceptions消息或Reason上执行一些字符串匹配以确定它是否是我们可以满足的内容时犹豫不决。

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

我知道可能会引发FaultException,但我觉得应该为故障背后的每个原因创建一个新类型是不现实的。

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

RecordDetails GetRecordById(string id)

void Add(RecordDetails record)

void Update(RecordDetailsUpdateRequest rdur)

现在在上面的示例中,如果使用不存在的id调用GetRecordById,则会收到FaultException,并显示一条消息,指出“无法找到记录”。同样,如果为已存在的记录调用Add,或者为不存在的记录调用Update,则只需使用Message / Reason详细说明失败原因的FaultException。我需要知道是否存在记录以确定是否应该更新或插入。正如我所提到的,我对于简单匹配字符串犹豫不决,因为我无法控制它们是否保持不变。

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

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

您的意见表示赞赏。

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:0)

始终使用FaultExceptions并将其作为OperationContract的一部分宣传,就像您的代码一样。

但是,我认为还有更多内容。

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

然后可以将它们与您的类一起使用,并且您的错误处理可以与您的逻辑分离,从而更清晰地执行此操作。这也意味着您不必在代码中重复相同的块。

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

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