我有一个非常老的asmx Web服务。由于限制,我无法直接致电此服务。因此,我正在创建WCF Web服务,它将充当客户端和实际Web服务之间的代理。我的客户端应用程序实际上是在调用asmx Web服务,现在将在调用wcf服务。同样,我不应该在客户端中进行任何代码更改。
我成功创建了服务。当尝试从我的客户端访问时,我收到此消息。由于EndpointDispatcher的ContractFilter不匹配,带有Action的消息无法在接收端处理。
我试图匹配我的代理Web服务以匹配现有Web服务。可能是我缺少了一些东西。请帮忙。
答案 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服务中添加更多日志记录)。