Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将ASMX转换为WCF后,无法从Perl API连接到WCF服务_Perl_Wcf_Soap_Asmx_Wcf Binding - Fatal编程技术网

将ASMX转换为WCF后,无法从Perl API连接到WCF服务

将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不匹配,无法在接收方处理具有操作“”的消息。这可能是因为契约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。请检

我们有一个ASMX服务,我们的客户端通过Perl API使用它。目前我们正在将ASMX服务转换为WCF,但我们的客户端无法向我们的WCF服务发送请求

当我们询问客户机时,他们说他们将通过SOAP以XML形式传递数据对象,他们不依赖于我们的服务代理,但在下面的日志中我们看到了错误消息

由于EndpointDispatcher上的ContractFilter不匹配,无法在接收方处理具有操作“”的消息。这可能是因为契约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。请检查发送方和接收方是否具有相同的合同和相同的绑定“

请告知我们如何解决/排除此问题

编辑

客户端正在发送给我们的XML。当客户端正在发送给我们的ASMX时,这是有效的:

<?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参数提供命名空间支持
根据评论进行编辑

我注意到您的服务存在一个潜在问题,该问题体现在您的WCFClient xml中:

<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">