抛出FaultException时WCF抛出CommunicationException

时间:2011-07-01 11:39:47

标签: wcf faultexception

解决方案:

一些跟踪显示正在抛出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。我会根据要求发布我的配置文件。

3 个答案:

答案 0 :(得分:6)

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>

答案 1 :(得分:0)

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

当我从Fault Contract中删除List并抛出Fault样式时,它显然给出了Fault contract异常,而不是通信异常。

希望它有所帮助, HydTechie。

答案 2 :(得分:0)

我遇到了这个问题,因为我在错误的地方有一个或多个断点。我使用Debug..Delete all BreakpointsCtrl-Alt-F9)删除了所有断点,并且所有的CommunicationException异常都消失了,并且替换为正确的消息。

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