【问题标题】:Calling a asmx webservice from wcf web service - ContractFilter mismatch从 wcf Web 服务调用 asmx Web 服务 - ContractFilter 不匹配
【发布时间】:2018-08-02 19:51:19
【问题描述】:

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

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

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

【问题讨论】:

  • 调用 ASMX 时遇到哪些限制?他们是技术性的还是政治性的?你知道调用是调用代理服务失败还是在代理服务和ASMX服务之间?可能想尝试建立一个您的客户端可以调用的 hello 方法来检查它是否是代理服务。你能发布一个代码示例吗?
  • 限制是出于安全原因。代理上的呼叫没有失败。

标签: wcf asmx


【解决方案1】:

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 服务中添加更多日志记录)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 2011-02-19
    • 1970-01-01
    • 2012-05-29
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多