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

时间:2013-07-26 22:23:31

标签: c# .net vb.net wcf response

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

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

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

我还可以创建一个ServiceResponse类,我的所有方法都用作返回类型 - 在那里我可以有一个“Messages”集合,但这似乎可能违反直觉。我宁愿我的方法的返回类型只是我期望在正常情况下回来的。

那么,最重要的是,是否存在处理从推荐的服务方法返回的消息的特定模式?

由于

2 个答案:

答案 0 :(得分:1)

您需要抛出strongly-typed soap fault

[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 :(得分:0)

在我看来,有两种情况 你希望在服务方面提出一些例外 2.您希望返回一个包含Service中出错的错误数据的类。

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

无论你选择哪一个,不要继承来自Exception,我已经读过这是不好的做法,你不想在WCF上序列化和传输基于异常的数据合同。