4

我正在尝试使用 net.pipe 绑定为我的服务与客户端交互创建一个进程内单元测试。与良好的 WCF 服务一样,它在服务操作上使用 FaultContractAttribute 将可能的错误(包装异常)暴露给元数据。我想通过 XML (App.config) 配置客户端和服务端点。 但是,每当抛出错误时,它只是一个 CommunicationException“管道已关闭”,而不是我所期望的类型错误。

System.ServiceModel.CommunicationException: There was an error reading from the pipe: The pipe has been ended. (109, 0x6d). 

我尝试为 net.pipe 添加 IMetadataExchange 端点,但这不起作用。我也试过了。在 Vista 上需要我为 http 端点 netsh 的 ACL。那也没有用。

自定义异常类:

public class ValidationException : ApplicationException { }

这是配置的最新尝试,但它抽出“在服务实施的合同列表中找不到合同名称'IMetadataExchange'”

任何有关如何完成此操作的示例或建议的链接将不胜感激。

<system.serviceModel>

  <client>
    <endpoint name="Client"
              contract="IService"
              address="net.pipe://localhost/ServiceTest/"
              binding="netNamedPipeBinding"
              bindingConfiguration="netPipeBindingConfig" />
  </client>

  <services>
    <service
      name="Service"
      behaviorConfiguration="ServiceFaults">
      <host>
        <baseAddresses>
          <add baseAddress="net.pipe://localhost/ServiceTest/"/>
          <add baseAddress="http://localhost/ServiceTest/"/>
        </baseAddresses>
      </host>
      <endpoint
        address=""
        binding="netNamedPipeBinding"
        bindingConfiguration="netPipeBindingConfig"

        name="ServicePipe"
        contract="IService" />
      <endpoint
        address="MEX"
        binding="mexNamedPipeBinding"
        bindingConfiguration="mexNetPipeBindingConfig"
        name="MexUserServicePipe"
        contract="IMetadataExchange" />
    </service>
  </services>

  <bindings>
    <netNamedPipeBinding>
      <binding name="netPipeBindingConfig"
               closeTimeout="00:30:00"
               sendTimeout="00:30:00" />
    </netNamedPipeBinding>
    <mexNamedPipeBinding>
      <binding name="mexNetPipeBindingConfig"></binding>
    </mexNamedPipeBinding>
  </bindings>

  <behaviors>
    <serviceBehaviors>
      <behavior name="ServiceFaults">
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
      <behavior name="MEX">
        <serviceMetadata 
          httpGetEnabled="true"
          httpGetUrl="http://localhost/ServiceTest/MEX"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>

</system.serviceModel>

4

4 回答 4

2

如果您上面描述的 ValidationException 类是您用于故障的类,那么它可能是您的问题的根源。您应该从 FaultException 派生错误异常,因为它是可序列化的。ApplicationException 不是。

Wagner 是对的,您需要使用 FaultContract 属性来装饰您的操作定义,并为其提供您的合同类型。您还应该使用 DataContract 和 DataMember 属性来装饰您的 FaultContract。

于 2008-12-15T14:14:28.107 回答
0

几天前我遇到了同样的错误。
我解决了创建自己的类(MyFault)并从服务器抛出 FaultException 并在客户端捕获它们。MyFault 有一个字符串成员,它是我希望客户端看到的异常消息。

我希望我说清楚了...我会尝试寻找一个不错的示例,然后将其发布在这里

于 2008-10-21T01:13:17.457 回答
0

问题很可能是反序列化或序列化请求或响应的错误。启用跟踪并使用 svctraceviewer 查看日志以了解确切的错误。

此外,请确保您的故障异常标有 [DataContract] 并且不继承和非 [DataContract] 类。

于 2008-10-21T02:04:37.883 回答
0

最后一件事要补充。您的运营合同是否定义了他们正在使用的 ServiceFault?

我的理解是,您必须在操作层定义您正在使用的 ServiceFault,并且您的业务逻辑会抛出一个 FaulException,其中 T 是您定义的 ServiceFault。

于 2008-11-20T20:44:45.080 回答