从WCF Web服务调用ASMX Web服务-ContractFilter不匹配

时间:2018-08-02 19:51:20

标签: wcf asmx

我有一个非常老的asmx Web服务。由于限制,我无法直接致电此服务。因此,我正在创建WCF Web服务,它将充当客户端和实际Web服务之间的代理。我的客户端应用程序实际上是在调用asmx Web服务,现在将在调用wcf服务。同样,我不应该在客户端中进行任何代码更改。

我成功创建了服务。当尝试从我的客户端访问时,我收到此消息。由于EndpointDispatcher的ContractFilter不匹配,带有Action的消息无法在接收端处理。

我试图匹配我的代理Web服务以匹配现有Web服务。可能是我缺少了一些东西。请帮忙。

1 个答案:

答案 0 :(得分:0)

ContractFilter不匹配几乎总是由于版本问题引起的。您可以通过将其放在客户端和WCF服务的共享类库中,尝试更新对WCF服务的“连接的服务”引用,或手动重新运行SvcUtil或使用WCF服务的ServiceContract的ChannelFactory。您还可以在WCF中添加更多日志记录,并使用实用程序 SvcTraceViewer 查看失败的地方。例如,将以下内容添加到WCF服务的web.config中:

<system.diagnostics>
<sources>
  <source name="System.ServiceModel.MessageLogging">
    <listeners>
             <add name="messages"
             type="System.Diagnostics.XmlWriterTraceListener"
             initializeData="c:\logs\messages.svclog" />
      </listeners>
  </source>
</sources>
</system.diagnostics>

<system.serviceModel>
<diagnostics>
<messageLogging 
     logEntireMessage="true" 
     logMalformedMessages="false"
     logMessagesAtServiceLevel="true" 
     logMessagesAtTransportLevel="false"
     maxMessagesToLog="3000"
     maxSizeOfMessageToLog="2000"/>
</diagnostics>
</system.serviceModel>

然后,您可以在SvcTraceViewer中打开.svclog文件,并查看其失败原因。但是,如果客户端调用已经失败,则可能无论如何您将看不到任何日志项。因此,将您的服务合同移至共享类库,并让客户端使用ChannelFactory将确保您的客户端对服务保持最新状态。现在,也有可能是WCF服务使对旧版ASMX服务的调用失败,然后下一步可能是启动Fiddler(或在旧版ASMX服务中添加更多日志记录)。