Несоответствие имени контракта службы WCF между клиентом и сервером - PullRequest
1 голос
/ 12 ноября 2011

Я пытался интегрировать свое веб-приложение с двумя службами WCF, предоставленными с одинаковыми именами контрактов на обслуживание, но с двумя разными адресами.Дело в том, что я хочу создать прокси-серверы для обоих сервисов в одной DLL, но это невозможно, так как оба контракта содержат одно и то же имя, я пытался использовать как вложенные пространства имен, так как он не работал, поскольку прокси-серверы размещены вВ отдельной DLL, отличной от веб-проекта, я изменил имя одного контракта на обслуживание, но получил эту ошибку:

Сообщение с действием 'http://ws.aramex.net/ShippingAPI/v1/RateCalculateService/CalculateRate' не может быть обработано в получателе из-заНесоответствие ContractFilter в EndpointDispatcher.Это может быть связано либо с несоответствием контракта (несоответствующие действия между отправителем и получателем), либо с несоответствием привязки / безопасности между отправителем и получателем.Убедитесь, что отправитель и получатель имеют один и тот же контракт и одну и ту же привязку (включая требования безопасности, например, Message, Transport, None).

Возможно ли каким-либо образом иметь другое имя контракта на стороне клиента, чемодин на сервере?

конечные точки:

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

Ответы [ 3 ]

0 голосов
/ 05 октября 2012

При обращении к файлу WSDL вы должны были сделать следующее:

  • Щелкните правой кнопкой мыши «Справочник по обслуживанию»
  • Добавить ссылку на сервис
  • В поле Message / Text введите локальный путь WSDL и найдите его
  • В этом же окне есть кнопка «Дополнительно», нажмите на нее.
  • Установите флажок «Всегда генерировать контракты сообщений»
0 голосов
/ 05 октября 2012

Я пытался интегрировать свое веб-приложение с двумя службами 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_Instance1 или BasicHttpBinding_Service_1_0_Instance2 для приведенного выше примера) в качестве параметра endpointConfigurationName для соответствующей перегрузки конструктора прокси-класса.

0 голосов
/ 12 ноября 2011

Не эксперт WCF, но почему бы не обойти это, создав 2 сервиса, которые проксируют исходные сервисы и создают уникальное имя контракта для каждого?

...