Несовпадение ContractFilter в исключении EndpointDispatcher - PullRequest
104 голосов
/ 30 марта 2011

У меня есть следующий сценарий, который я пытаюсь проверить:

  1. Общий WSDL
  2. Конечная точка WCF, реализующая объекты на основе WSDL и размещенная в IIS.
  3. Клиентское приложение, использующее прокси на основе WSDL для создания запросов.

Когда я выполняю вызов веб-службы от клиента к конечной точке службы, я получаю следующее исключение:

{"Сообщение с действием" http://IMyService/CreateContainer' не может быть обработано в получателе из-за несоответствия ContractFilter в EndpointDispatcher. Это может быть связано либо с несоответствием контракта (несоответствующие действия между отправителем и получателем), либо с несоответствием привязки / безопасности между отправителем и получателем. Убедитесь, что отправитель и получатель имеют один и тот же контракт и одну и ту же привязку (включая требования безопасности, например, Сообщение, Транспорт, Нет). "}

Я начал использовать MS Service Trace Viewer, но не уверен, где искать. При взгляде на классы в клиенте и конечной точке они выглядят одинаково.

Как начать отлаживать эту проблему?

Каковы некоторые возможные причины этого исключения?

Ответы [ 26 ]

73 голосов
/ 24 октября 2011

У меня была эта ошибка, и она была вызвана тем, что в контракте получателя не реализован вызываемый метод.По сути, кто-то не развернул последнюю версию службы WCF на хост-сервере.

72 голосов
/ 30 марта 2011

«Несоответствие ContractFilter в EndpointDispatcher» означает, что получатель не смог обработать сообщение, поскольку он не соответствовал ни одному из контрактов, настроенных получателем для конечной точки, получившей сообщение.:

  • У вас разные контракты между клиентом и отправителем.
  • Используется различная привязка между клиентом и отправителем.
  • Параметры безопасности сообщений не согласованымежду клиентом и отправителем.

Посмотрите на класс EndpointDispatcher для получения дополнительной информации по этому вопросу.

Итак:

Убедитесь, что ваши клиентские и серверные контракты совпадают.

  • Если вы создали свой клиент из WSDL, обновлен ли WSDL?
  • Если вы недавно внесли изменения в контракт, развернули ли вы правильную версию как клиента, так и сервера?
  • Если вы создали классы клиентских контрактов вручную, убедитесь, что пространства имен, eleимена элементов и имена действий совпадают с ожидаемыми сервером.

Убедитесь, что привязки между клиентом и сервером одинаковы.

  • Если выВы используете файл .config для управления своими конечными точками, убедитесь, что элементы привязки совпадают.

Убедитесь, что настройки безопасности одинаковы для клиента и сервера.

  • Если вы используете файл .config для управления своими конечными точками, убедитесь, что элементы безопасности совпадают.
19 голосов
/ 17 ноября 2011

У меня была эта проблема, и я обнаружил, что в моем прокси-генераторе, который я скопировал из другого сервиса, я забыл изменить имя сервиса.

Я изменил это ...

Return New Service1DataClient(binding, New EndpointAddress(My.Settings.WCFServiceURL & "/Service1Data.svc"))

до ...

Return New Service2DataClient(binding, New EndpointAddress(My.Settings.WCFServiceURL & "/Service2Data.svc"))

Это была простая ошибка кода, но почти невозможно ее отладить. Надеюсь, это сэкономит кому-то время.

17 голосов
/ 20 февраля 2013

Вы также получите это, если попытаетесь подключиться к неправильному URL ;)

В моей системе определены две конечные точки и службы с похожими именами.

Получил именно эту ошибку, когда URL-адреса менялись на моем клиенте в какой-то момент. Действительно почесал голову, пока, наконец, не понял эту глупую ошибку.

9 голосов
/ 24 февраля 2015

Для клиента Java, вызывающего конечную точку .net. Это было вызвано несовпадением заголовка Soap Action.

Content-Type: application/soap+xml;charset=UTF-8;action="http://example.org/ExampleWS/exampleMethod"

Приведенный выше заголовок HTTP или следующий тег XML должен соответствовать действию / методу, которые вы пытаетесь вызвать.

   <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/" xmlns:gen="http://schemas.datacontract.org/2004/07/GenesysOnline.WCFServices">
   <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
      <wsa:To>https://example.org/v1/Service.svc</wsa:To>
      <wsa:Action>http://example.org/ExampleWS/exampleMethod</wsa:Action>
   </soap:Header>
   <soap:Body>
    ...
   </soap:Body>
</soap:Envelope>
9 голосов
/ 17 апреля 2012

Я решил эту проблему, добавив в свой контракт следующее:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

Например:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class MyUploadService : IMyUploadService
{

}
8 голосов
/ 27 февраля 2014

Я получил это после того, как скопировал файл svc и переименовал его. Хотя имя файла и файл svc.cs были правильно переименованы, разметка по-прежнему ссылалась на исходный файл.

Чтобы исправить это, щелкните правой кнопкой мыши на скопированном файле SVC и выберите Просмотреть разметку и измените ссылку на службу.

4 голосов
/ 29 декабря 2015

Как упоминалось в других ответах, таких как @chinto, это происходит, когда элемент заголовка SOAP: Action не соответствует конечной точке.

Вы можете найти правильный URI для использования, посмотрев на WSDL сервера. Вы увидите элемент операции с дочерним элементом ввода, который имеет атрибут «Действие». Это то, что должно быть в SOAP: действие по запросу клиента.

<wsdl:operation name="MethodName">
<wsdl:input wsaw:Action="http://tempuri.org/IInterface/MethodName" message="tns:IInterface_MethodName_InputMessage"/>
<wsdl:output wsaw:Action="http://tempuri.org/IInterface/MethodNameResponse" message="tns:IInterface_MethodName_OutputMessage"/>
</wsdl:operation>
3 голосов
/ 14 сентября 2015

У меня была такая же проблема. Проблема заключалась в том, что я скопировал код из другой службы в качестве отправной точки и не изменил класс службы в файле .svc

Откройте файл .svc и убедитесь, что атрибут Service указан правильно.

 <%@ ServiceHost Language="C#" Debug="true" Service="SME.WCF.ApplicationServices.ReportRenderer" CodeBehind="ReportRenderer.svc.cs" %>
2 голосов
/ 11 апреля 2012

У меня была похожая ошибка. Это может быть связано с тем, что вы изменили некоторые настройки контракта в файле конфигурации после того, как он был добавлен в ваш проект. решение - обновите ссылку на веб-сервис вашего проекта VSstudio или создайте новый прокси-сервер, используя svcutil.exe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...