【问题标题】:WCF Recommended pattern for returning failure messagesWCF 推荐的返回失败消息的模式
【发布时间】:2013-07-26 22:23:31
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

  • 我认为ServiceResponse 类没有任何问题,它提供了一个错误属性供您评估。
  • 我们在工作中使用了一个类似的系统,你是对的,它可以工作 - 但有时感觉它是围绕返回值的另一层抽象,但可能有更好、更有效的方式这样做。

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


【解决方案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);

然后客户端就可以捕捉到了。

【讨论】:

  • 我尝试在我的方法中这样做:例如,我检查用户 IsEnabled 属性,如果值为 false,则抛出一个新的 FaultException&lt;LoginFailureException&gt;,但在调试时,它会在那里中断而不是下降下到客户(它正在寻找它)
  • 可能是 VS 中的调试配置。如果没有调试,你会得到预期的行为吗?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    相关资源
    最近更新 更多