gpt4 book ai didi

wcf - 您如何配置 WCF 以支持使用 net.pipe 的主机和客户端在同一进程中的 FaultContract?

转载 作者:行者123 更新时间:2023-12-04 22:30:50 25 4
gpt4 key购买 nike

我正在尝试使用 net.pipe 绑定(bind)为我的服务与客户端交互创建一个进程内单元测试。与良好的 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 { }

这是配置的最新尝试,但它抽出“在服务实现的契约(Contract)列表中找不到契约(Contract)名称'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>

最佳答案

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

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

关于wcf - 您如何配置 WCF 以支持使用 net.pipe 的主机和客户端在同一进程中的 FaultContract?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/220401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com