将ASMX转换为WCF后,无法从Perl API连接到WCF服务
我们有一个ASMX服务,我们的客户端通过Perl API使用它。目前我们正在将ASMX服务转换为WCF,但我们的客户端无法向我们的WCF服务发送请求 当我们询问客户机时,他们说他们将通过SOAP以XML形式传递数据对象,他们不依赖于我们的服务代理,但在下面的日志中我们看到了错误消息 由于EndpointDispatcher上的ContractFilter不匹配,无法在接收方处理具有操作“”的消息。这可能是因为契约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。请检查发送方和接收方是否具有相同的合同和相同的绑定“ 请告知我们如何解决/排除此问题 编辑 客户端正在发送给我们的XML。当客户端正在发送给我们的ASMX时,这是有效的:将ASMX转换为WCF后,无法从Perl API连接到WCF服务,perl,wcf,soap,asmx,wcf-binding,Perl,Wcf,Soap,Asmx,Wcf Binding,我们有一个ASMX服务,我们的客户端通过Perl API使用它。目前我们正在将ASMX服务转换为WCF,但我们的客户端无法向我们的WCF服务发送请求 当我们询问客户机时,他们说他们将通过SOAP以XML形式传递数据对象,他们不依赖于我们的服务代理,但在下面的日志中我们看到了错误消息 由于EndpointDispatcher上的ContractFilter不匹配,无法在接收方处理具有操作“”的消息。这可能是因为契约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。请检
<?xml version="1.0" encoding="utf-8">
<soap:envelope xmlns:soap="reference url" xmlns:xsi="reference url">
xmlns:xsd="http://www.w3.org/2001/xmlschema">
<SOAP:body>
<contractname xmlns="http://tempuri.org/">
<xml>
<foo>
<fooid>1</fooid>
</foo>
</xml>
<contractname>
</soap:body>
</soap:envelope>
请注意,我们的客户机不依赖于我们的WSDL。当握手最初开始时,我们团队的开发人员向客户端发送了一个示例XML请求,因此我相信他们可能会编写Perl脚本来生成与我们团队发送的XML完全相同的XML,所以我应该要求他们修改脚本以匹配我们期望的当前脚本
我可以修改我的服务合同吗?我们的服务将接受他们正在传递的相同XML。如果您的客户不依赖元数据来使用您的服务,那么他们已经构建了一个非常脆弱的服务集成。如果你改变服务,他们认为会发生什么 无论如何,您可以尝试的第一件事是通过basicHttpBinding公开您的服务,这将创建一个作为SOAP 1.1服务的端点,与asmx使用的SOAP版本相同 谷歌搜索如何使wcf服务看起来像。asmx返回许多结果,包括: 一旦我们对WCF服务接口进行了上述更改,现在 客户端应该能够无缝地与WCF服务进行对话 在这个过程中需要注意的几件事
- 将basicHttpBinding用于服务绑定
- 删除用于启用windows身份验证的MEX终结点
- 使用XmlSerializerFormatAttribute启用正确的消息传递格式
- 使用Action/ReplyAction参数提供命名空间支持
<contractname xmlns="tempuri.org">
应该是
<contractname xmlns="http://tempuri.org">
能否检查服务定义代码以确保正确设置OperationContract的操作参数。事实上,你可以发布你的服务代码吗
还有:我认为这里有一个更深层次的问题值得讨论,它与api/服务提供商及其消费者之间的关系中必须存在的潜规则有关
通过提供api/服务,提供者默认同意避免不必要或不合理的破坏性更改
通过使用服务,除其他事项外,消费者默许跟踪和响应服务内的合理或必要变更
在这种情况下,您的消费者似乎不遵守“协议”。期望服务端点永远不会改变是一种不合理的期望
虽然很有可能更改服务以适应客户机,但从技术角度来看,客户机更改服务以适应服务会容易得多,因此可以使用WSDL等服务元数据 您能否向我们展示您用于定义WCF端点(端点、绑定、行为等)的配置?@hugo我无法在此处输入所有内容,但我可以确认我们的服务正在使用httpbasicbinding。不幸的是,我们无法控制诸如绑定端点等配置。这些配置将在服务器级别进行控制。我们的配置文件不应具有此类设置。您确定客户端使用的WSDL文件与WCF服务生成的WSDL文件相同吗?@hugo the OP说他们的客户端没有使用WSDL。@Tom不是从服务中使用代理并不意味着不能使用WSDL生成自己的代理客户端(如Java、Delphi等)。但是我们有客户端发送的XML文件,如果Vicky提供,我们可以将其与服务提供的WSDL进行比较。感谢tom的详细回答。我已经按照您的建议修改了服务接口,然后我使用测试客户端运行我的服务,然后我看到了WCF Testclient用于调用服务的XML中的差异,但仍然是在我的客户端调用他们得到相同的错误,所以我编辑了添加示例XML的帖子。你能看一下并提出建议吗!!!
[ServiceContract]
[XmlSerializerFormat(Use = OperationFormatUse.Literal, Style = OperationFormatStyle.Document)]
public interface IStockService
{
[OperationContract(Action="http://tempuri.org/GetStockValue", ReplyAction="http://tempuri.org/GetStockValue")]
int GetStockValue(string stockSymbol);
[OperationContract(Action="http://tempuri.org/GetCompanyDetails", ReplyAction="http://tempuri.org/GetCompanyDetails")]
Company GetCompanyDetails(string stockSymbol);
}
<contractname xmlns="tempuri.org">
<contractname xmlns="http://tempuri.org">