首页 > 解决方案 > 从 wcf Web 服务调用 asmx Web 服务 - ContractFilter 不匹配

问题描述

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

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

我试图匹配我的代理网络服务以匹配现有的网络服务。可能是我错过了一些东西。请帮忙。

标签: wcfasmx

解决方案


ContractFilter 不匹配几乎总是由于版本问题。您可以尝试更新对 WCF 服务的“连接服务”引用,或手动重新运行 SvcUtil 或使用 WCF 服务的 ServiceContract 的 ChannelFactory,方法是将其放入客户端和 WCF 服务的共享类库中。您还可以在 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 文件并查看它失败的原因。但是,如果客户端调用已经失败,那么您可能无论如何都看不到任何日志项。因此,将您的 Service Contract 移动到共享类库并让客户端使用 ChannelFactory 将确保您的客户端更新该服务。现在也有可能是 WCF 服务对旧 ASMX 服务的调用失败,然后启动 Fiddler 可能是下一步(或在旧 ASMX 服务中添加更多日志记录)。


推荐阅读