4

解决方案:

一些跟踪显示 CommunicationException 被抛出,因为我的异常 T 没有正确序列化存在问题;因为,在两层深处,我有一个匿名类型的对象,它是不可序列化的。删除它并冒泡更改似乎可以修复它。在那之前我还做了一些其他的小事,但我一生都记不起它是什么,只是它没有在配置中完成。

我从我的踪迹中收到消息,例如:

Type 'RebuiltWCFService.Requests.HelloWorldRequest' with data contract name 'HelloWorldRequest:http://schemas.datacontract.org/2004/07/RebuiltWCFService.Requests' is not expected. 
Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

原帖

我今天遇到了一个看似奇怪的问题,我就是找不到答案!

问题:当我抛出一个 FaultException 时,我的服务正在抛出一个 CommunicationException!如果我不抛出异常,它就不会这样做。

在我的服务中,我正确定义了故障合同:

[OperationContract]
[FaultContract(typeof(Faults.HelloWorldFault))]
Responses.HelloWorldResponse HelloWorld(Requests.HelloWorldRequest parameter);

然后在错误条件下我抛出正确类型的异常:

if (_errors.Count() > 0)
{
    Faults.HelloWorldFault fault = new Faults.HelloWorldFault(_errors);
    throw new FaultException<Faults.HelloWorldFault>(fault, new FaultReason("There are one or more errors in the request. Check the 'Errors' property for more detaisl"));
}

然后我在客户端捕捉到它:

try
{
    response = client.HelloWorld(new BasicService.HelloWorldRequest() { Number = 49 });
    client.Close();
    Console.WriteLine(String.Format("Response message: {0}, Response number: {1}", response.Message, response.Number));
}
catch (FaultException<BasicService.HelloWorldFault> ex)
{
    ...
}

这对我来说似乎一切正常,并且应该可以工作。但是,一旦我去测试我的错误子句(通过提供错误的数据,例如缺少的字段),整个事情就死在我身上了。当我抛出我的 FaultException 时,服务会抛出带有消息的 CommunicationException

An error occurred while receiving the HTTP response to http://localhost:8732/Design_Time_Addresses/RebuiltWCFService/Service1/. 
This could be due to the service endpoint binding not using the HTTP protocol. 
This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). 
See server logs for more details.

有人可以提供一些关于这个的见解吗?我正在使用 basicHttp 绑定,我也尝试过使用 wsHttp。我会根据要求发布我的配置文件。

4

3 回答 3

7

FaultException 是 CommunicationException 的子代。因此,您的代码中发生的事情没有任何问题。

如果您在处理时不确定异常是什么,通常会报告为 CommunicationException。如果您想以自己的方式处理您的特定异常,请使用以下结构。

try
{ ... }
catch (FaultException<MyDemoException> me)
{ ... }
catch (FaultException fe)
{ ... }
catch (CommunicationException ce)
{ ... }
catch (Exception ex)
{ ... }

在上述结构中,Exception 是 CommunicationException 的父级。CommunicationException 是 FaultException 的父级,以此类推。

System.Object 
  System.Exception
    System.SystemException
      System.ServiceModel.CommunicationException
        System.ServiceModel.FaultException
          System.ServiceModel.FaultException<TDetail>
            System.ServiceModel.Web.WebFaultException<T>
于 2011-07-01T13:26:31.790 回答
0

谢谢你们,你们帮助我更好地理解了这个问题。我的观察:我保留了一个 List MyData - 保存任何无法序列化的通用/动态集合,因此导致关闭连接,因此出现通信异常。

当我从故障合同中删除列表并抛出故障样式时,它显然是给故障合同异常,而不是通信异常。

希望它有所帮助,HydTechie。

于 2013-12-02T10:53:01.747 回答
0

我遇到了这个问题,因为我在错误的地方有一个或多个断点。Debug..Delete all Breakpoints我用( )删除了所有断点Ctrl-Alt-F9,所有 CommunicationException 异常都消失了,取而代之的是返回的正确消息。

是的,超时是 60 秒,所以这不应该发生,所以它可能是 Visual Studio 2012 的一些奇怪的工件。

于 2013-12-05T16:45:47.610 回答