【问题标题】:Throwing exception in WCF service operation, anything to look out?在 WCF 服务操作中抛出异常,有什么要注意的吗?
【发布时间】:2011-12-06 09:48:32
【问题描述】:

我刚刚学习 WCF,并编写了一个托管 WCF 服务的 Windows 服务。自从我在远程服务器的 service.msc 中启动它(物理上远程,并且非常慢)以来,我想我已经在这里和那里遇到并修复了一百个错误。我现在终于卡住了。

此时,我已启用跟踪和消息记录。第一个也是唯一一个函数调用如下所示:

[OperationContract]
public MyServiceResponse ConnectToAXDynamicsViaDotNET2BusinessConnectorWithSadFace()
{
    try
    {
        throw new NotImplemented();
    }
    catch(Exception ex)
    {
         return new MyServiceResponse(ex, ex.Message);
    }
}

[DataContract]
public class MyServiceResponse
{
     // ...
}

在调用操作时,客户端只是坐下来等待直到超时。检查跟踪,它记录了我抛出的异常。所以这让我想知道 WCF 是否真的在那里阻塞并忽略我的 catch 子句。

然后我只用一个简单的返回值进行了测试,没有抛出,它终于可以工作了。

我的问题是,我怎样才能使上述场景发挥作用,即。捕获异常并将合理的结果返回给客户端?可能只是跟踪阻碍了我,但我想在整个调试过程中启用跟踪,否则真的很难工作。

感谢您的宝贵帮助!

编辑:抱歉,我是在发布此问题后立即发现的。一直在发生:http://msdn.microsoft.com/en-us/library/ee942778.aspx 但我还没有读到它,因为我现在要跑了。不确定它会解决我的问题。

【问题讨论】:

  • 跟踪或捕获异常的方式都不会导致任何问题。我猜你还有别的事情发生。如果您不抛出异常而只返回响应会发生什么?尝试通过 WCF 测试客户端调用您的服务。你能成功调用服务吗?
  • 谢谢 chris.house.00;正如我在 OP 中提到的,“然后我只用一个简单的返回值进行了测试,没有抛出,它终于可以工作了。”
  • 大问题:你正在吃你的异常的细节。当您知道究竟发生了什么时使用特定的FaultException<T>,并在[FaultContract] 中定义。否则,不要捕获异常,让 WCF 处理它。
  • @JohnSaunders 抱歉,我刚刚编辑了代码。我也尝试将异常对象一起传递。我知道这违反了服务模型规则等。这只是测试代码。我在学习。无论如何,我现在使用的是 FaultException。不过,感谢您的回复。

标签: wcf exception


【解决方案1】:

有被否决的风险,但只是为了记录和提出这个问题的一般用途:

通过阅读 FaultException 处理文章,我猜测上述行为是由于 Exception 类不可序列化所致。即使启用了“向客户端发送(未知)故障”,该服务也会默默地断开自身连接而不返回任何错误消息。至于为什么会这样,我还不知道。如果我发现更多信息会更新。

我已经改为抛出新的 FaultException() 而不是返回我自己的 MyServiceResponses。

【讨论】:

  • 另外,当FaultException中的CustomData有序列化问题时,比如DataMember没有setter,也会静默断开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多