我们有一个.NET 2.0 Forms App客户端,它使用WSE连接到asmx Web服务。
我们希望将服务升级到WCF并使用VS 2010和.NET 4,但我们无法强迫现有(公司)客户更新其客户端软件/框架等,因此我们在如果我们能够保持向后兼容性,那么升级服务的唯一方法就是一个位置。
我们可以在客户端更新app.config,但不能更新可执行文件,这意味着我们无法添加新的服务引用。
我们尝试将WCF服务配置为接受来自客户端应用程序的调用,但未对客户端进行更改,但未成功。我怀疑这甚至可以做到;当然在客户端添加一个新的引用使它工作,但使用现有的引用并试图用新服务“伪造”它不会。
服务端的配置如下所示:
<bindings>
<basicHttpBinding>
<binding name="OnePointOneBinding" bypassProxyOnLocal="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="ServiceBehaviour" name="xyz.Services.xyzService">
<endpoint binding="basicHttpBinding" bindingConfiguration="OnePointOneBinding"
name="BasicBindingSvc" contract="xyz.Services.IxyzService" />
</service>
</services>
我们得到的错误是:
由于EndpointDispatcher上的ContractFilter不匹配,无法在接收方处理带有Action'http://webservices.xyz.co.uk/xyz/DoTest'的消息。这可能是由于合同不匹配(发送方与接收方之间的操作不匹配)或发送方与接收方之间的绑定/安全性不匹配。检查发件人和收件人是否具有相同的合同和相同的约束(包括安全要求,例如邮件,传输,无)。
很高兴收到任何意见
答案 0 :(得分:0)
以上的一些WSE细节:
来自wse3PolicyCache.config:
<policies xmlns="http://schemas.microsoft.com/wse/2005/06/policy">
<extensions>
<extension name="usernameOverTransportSecurity" type="Microsoft.Web.Services3.Design.UsernameOverTransportAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<extension name="requireActionHeader" type="Microsoft.Web.Services3.Design.RequireActionHeaderAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</extensions>
<policy name="usernameTokenSecurity">
<usernameOverTransportSecurity />
<requireActionHeader />
</policy>
</policies>
来自客户端app.config:
<microsoft.web.services3>
<security>
<!-- Specifies the time buffer used by WSE to determine when a SOAP message is valid. -->
<timeToleranceInSeconds value="7200" />
<!-- Defines the default number of seconds that a SOAP message is valid after its creation. -->
<defaultTtlInSeconds value="300" />
</security>
<policy fileName="wse3policyCache.config" />
</microsoft.web.services3>
我不知道还有什么相关的......
编辑:
所以我做了一些挖掘,发现WCF服务的WSDL包含接口名称(我将其命名为'IService')附加到命名空间,使其成为http://x.y.x/IService,当客户端期待http://x.y.z/productname。所以我将界面的名称更改为'productname',现在命名空间正确。然后,这给出了以下(新)错误:
反序列化操作'Authorise2'的请求消息正文时出错。 OperationFormatter遇到无效的Message正文。 预计会找到名为“Authorise2”的节点类型“Element”和名称空间“http://x.z.z”。 找到名为“Authorise2”的节点类型“Element”和名称空间“http://x.z.z/productname”
界面具有以下签名:
[ServiceContract(Namespace =“http://x.y.z”)] 公共接口产品名称 { [OperationContract的] AuthorisationDetails Authorise2(字符串用户名,字符串密码); }
那么如何添加'productname'扩展名?更重要的是,我们怎样才能摆脱它呢?