1

我正在使用一个使用 WCF 服务的客户端。在各种情况下,服务只是引发一个带有关联消息的 FaultException,告知给定故障背后的原因。

其中一些错误是可以由我们的客户端应用程序处理的事情,但我犹豫是否简单地尝试对 FaultExceptions 消息或原因执行一些字符串匹配以确定它是否是我们可以满足的。

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

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

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

RecordDetails GetRecordById(string id)

void Add(RecordDetails record)

void Update(RecordDetailsUpdateRequest rdur)

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

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

至少通过这种方式,我可以识别错误原因,而无需求助于字符串匹配。

感谢您的想法。

4

2 回答 2

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)。

于 2011-07-06T02:41:13.603 回答
0

总是使用 FaultExceptions 并将它们作为 OperationContract 的一部分进行宣传,就像您的代码一样。

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

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

然后可以将它们与您的类一起使用,并且您的错误处理可以与您的逻辑分开,从而以一种更简洁的方式来执行此操作。这也意味着您不必在整个代码中重复相同的块。

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

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

于 2011-07-06T10:21:02.247 回答