WCF推荐用于返回失败消息的模式

本文关键字:消息 模式 失败 返回 用于 WCF | 更新日期: 2023-09-27 18:25:03

我正在编写一个WCF服务,想知道是否有一个推荐的模式可以从服务方法返回各种消息。

例如,如果我在服务中调用public User Login(string userName, string passWord)方法,我希望它在用户对象是有效用户时返回我的用户对象。但是,如果详细信息不正确,或者帐户被禁用,我希望能够将数据返回给客户端。

当这两种情况中的一种发生时,我最初认为我会抛出一个LogonFailureException(自定义异常类)。在客户端中,我可以捕捉到这种类型并按照自己的意愿进行处理。但是,如果我正在调试应用程序,它会在抛出异常时中断(即使我将其封装在FaultException中)。

我还可以创建一个ServiceResponse类,我的所有方法都将其用作返回类型——然后我可以在其中创建一个"Messages"集合,但这似乎可能违反直觉。我宁愿我的方法的返回类型只是我期望在正常情况下返回的类型。

那么,归根结底,是否有一种特殊的模式来处理从推荐的服务方法返回的消息?

感谢

WCF推荐用于返回失败消息的模式

您需要抛出一个强类型的soap错误:

[DataContract]
public class ConnectionFault
{
  [DataMember]
  public string Issue { get; set; }
  [DataMember]
  public string Details { get; set; }
}

[FaultContract(typeof(ConnectionFault))]
[FaultContract(typeof(DataReaderFault))]
[OperationContract]
Int16 GetInStock(int productId);
//when it's time to throw the exception
var connectionFault = new ConnectionFault();
connectionFault.Issue = "Problem connecting to the database";
connectionFault.Details = ex.Message;
throw new FaultException<ConnectionFault>(connectionFault);

然后客户端可以捕获它。

在我看来,有两种情况
1.您希望在服务端抛出某种异常
2.您希望返回一个类,该类包含Service中出现错误的错误数据。

有什么区别?第一个就像yaron写的那样,你抛出并接住一个FaultException
第二种方法只是返回一个对象,例如,如果您的服务出现问题,您总是返回ErrorData-这是一个以字符串形式包含消息和异常堆栈的数据协定-您可以添加ErrorData.Update方法,每次在服务中捕获新的异常时,都会更新ErrorData消息。。这对于长时间运行的调用是很好的,这些调用可能会捕获几个异常,但您不想在第一个异常时中止。

无论您选择哪一个,都不要从Exception中继承,我已经读到这是一种糟糕的做法,您不想在WCF上序列化和传输基于Exception的数据契约。