wcf - 从 wcf Web 服务调用 asmx Web 服务 - ContractFilter 不匹配
问题描述
我有一个非常古老的 asmx 网络服务。由于限制,我无法直接调用此服务。所以我正在创建一个 WCF Web 服务,它将充当客户端和实际 Web 服务之间的代理。我的客户端应用程序,它实际上调用了 asmx Web 服务,现在将调用 wcf 服务。同样这样,我不应该在我的客户端中进行任何代码更改。
我成功创建了服务。在尝试从我的客户端访问时,我收到此消息。由于 EndpointDispatcher 的 ContractFilter 不匹配,无法在接收时处理带有 Action 的消息。
我试图匹配我的代理网络服务以匹配现有的网络服务。可能是我错过了一些东西。请帮忙。
解决方案
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 服务中添加更多日志记录)。
推荐阅读
- php - Cloud Firestore API 未启用,尝试从 PHP 访问时出现 FAILED_PRECONDITION
- ios - 无法在 Xcode 中找到设备支持文件
- android-studio - 无法在 Android Studio 中添加 Sonar Lint 和 SonarCube 插件
- php - 从以顺序名称存储的目录中检索图像并存储在数组中
- mysql - 尝试使用 mySQL Workbench 连接到 Amazon AWS 上的 mySQL 数据库
- ios - 在 NIB 中面临 CGAffineTransform 的问题
- javascript - 将数组中的最后一项返回到第一个位置
- node.js - 如何从 authoriz.net 获取未结算的交易列表?
- vue.js - V-tooltip: 从方法中关闭 Popover
- reactjs - 如何在我的组件中使用 getDerivedStatefromProps