0

我正在编写 WCF 服务,并且想知道是否有推荐的模式用于从服务方法返回各种消息。

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

我最初认为LogonFailureException当这两种情况之一发生时我会抛出一个(自定义异常类)。然后在客户端中,我可以捕获这种类型并根据需要进行处理。但是,如果我正在调试应用程序,它会在抛出异常时中断(即使我将其包装在 FaultException 中)。

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

那么,归根结底,是否存在处理从推荐的服务方法返回的消息的特定模式?

谢谢

4

2 回答 2

1

你需要抛出一个强类型的肥皂错误

[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);

然后客户可以抓住它。

于 2013-07-27T00:29:19.450 回答
0

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

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

无论您选择哪一个,都不要从异常继承,我已经读过这是不好的做法,您不想通过 WCF 序列化和传输基于异常的数据协定。

于 2013-07-27T10:38:48.710 回答