【问题标题】:WCF service contract name mismatch between client and server sides客户端和服务器端之间的 WCF 服务合同名称不匹配
【发布时间】:2011-12-27 13:26:10
【问题描述】:

我试图将我的 Web 应用程序与两个 WCF 服务集成,这些服务具有相同的服务合同名称,但位于两个不同的地址。问题是我想在一个 DLL 中为这两种服务创建代理,但这是不可行的,因为两个合同都具有相同的名称,我尝试使用嵌套命名空间,它也不起作用,因为代理托管在除了 web 项目之外的单独 DLL,我更改了一个服务合同的名称,但出现此错误:

带有动作的消息 'http://ws.aramex.net/ShippingAPI/v1/RateCalculateService/CalculateRate' 由于 ContractFilter 不匹配,无法在接收方处理 在 EndpointDispatcher。这可能是因为合同 mismatch(发送方和接收方之间的操作不匹配)或 发送方和接收方之间的绑定/安全不匹配。查看 发送者和接收者具有相同的合同和相同的绑定 (包括安全要求,例如消息、传输、无)。

客户端的合约名称是否可能与服务器端的合约名称不同?

端点:

<client>
      <endpoint address="http://ws.dev.aramex.net/shippingapi/shipping/service_1_0.svc"
          binding="basicHttpBinding" bindingConfiguration="basic"
          contract="Service_1_0" name="BasicHttpBinding_Service_1_0" />

      <endpoint address="http://ws.aramex.net/shippingapi/ratecalculator/service_1_0.svc"
         binding="basicHttpBinding" bindingConfiguration="basic"
         contract="RateCalculateService" name="BasicHttpBinding_Service_1_0" />
    </client>

第二个端点的原始合约名称是“Service_1_0”

【问题讨论】:

    标签: wcf wcf-client


    【解决方案1】:

    不是 WCF 专家,但为什么不通过创建 2 个代理原始服务并为每个服务创建唯一合同名称的服务来解决此问题?

    【讨论】:

    • 如果我们中间有另一个代理服务,这不会影响性能吗?
    【解决方案2】:

    在引用您的 WSDL 文件时,您应该执行以下操作:

    • 右键单击“服务参考”
    • 添加服务参考
    • 在消息/文本框中输入 WSDL 的本地路径并搜索它
    • 在同一个窗口中有一个“高级”按钮,点击它。
    • 选中指定“始终生成消息合同”的复选框

    【讨论】:

      【解决方案3】:

      我试图将我的 Web 应用程序与两个 WCF 服务集成,这些服务具有相同的服务合同名称但位于两个不同的地址。

      您说的服务合同名称相同吗?你的意思是服务合同是一样的吗?

      如果是这样,为什么不指定两个具有不同名称和相同合约的端点:

      <client>
          <endpoint address="http://ws.dev.aramex.net/shippingapi/shipping/service_1_0.svc"
            binding="basicHttpBinding" bindingConfiguration="basic"
            contract="Service_1_0" name="BasicHttpBinding_Service_1_0_Instance1" />
      
            <endpoint address="http://ws.aramex.net/shippingapi/ratecalculator/service_1_0.svc"
               binding="basicHttpBinding" bindingConfiguration="basic"
               contract="Service_1_0" name="BasicHttpBinding_Service_1_0_Instance2" />
      </client>
      

      然后将端点名称(上例为BasicHttpBinding_Service_1_0_Instance1BasicHttpBinding_Service_1_0_Instance2)作为参数endpointConfigurationName 指定给适当的代理类构造函数重载。

      【讨论】:

        猜你喜欢
        • 2015-12-21
        • 1970-01-01
        • 1970-01-01
        • 2018-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        相关资源
        最近更新 更多