WSDL первый WCF-сервер, на котором клиент не отправляет SOAPAction - PullRequest
6 голосов
/ 10 мая 2010

Я реализую веб-сервис WCF, который взаимодействует с клиентом, чей код я не контролирую. WSDL был предоставлен клиентом.

Я сгенерировал файлы C # из WSDL, используя SvcUtil, и, кроме обсуждаемых ошибок здесь У меня не было проблем.

После размещения службы в IIS 7.0 с включенным SSL (требуется клиентом) я попытался заставить клиента выполнить запрос к службе.

В этот момент я получил следующую ошибку:

The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver.  Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).

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

Затем я попытался использовать SOAPUI, используя WSDL, поставляемый с клиентом. Это не удалось с той же пустой ошибкой действия, описанной выше.

Затем я подключил Wireshark (включив расшифровку SSL) и убедился, что в сообщении, отправленном клиентом, действительно отсутствует действие SOAPAction, поэтому, похоже, это определенно проблема.

Поскольку я не могу изменить клиента, есть ли способ заставить веб-службу WCF взаимодействовать с таким клиентом? Я предполагаю, что это должно было бы принять запросы без SOAPAction и вместо этого получить желаемый запрос от типа объекта запроса в конверте SOAP?

1 Ответ

18 голосов
/ 11 мая 2010

У меня сработало следующее (на основе этой темы):

  1. Загрузите примеры Microsoft WCF.
  2. Добавьте следующие файлы в ваш проект из WF_WCF_Samples \ WCF \ Extensibility \ Interop \ RouteByBody \ CS \ service
    • DispatchByBodyOperationSelector.cs
    • DispatchByBodyBehaviorAttribute.cs
  3. Добавьте следующие атрибуты в ваш интерфейс (рядом с вашим ServiceContract)
    • XmlSerializerFormat
    • DispatchByBodyBehavior
  4. Добавьте следующее в ваш сервисный интерфейс

    [OperationContract(Action = "")]
    public void DoNothing()
    {
    }
    
  5. Для моего сервиса WrapperName и Wrappernamespace равны null для всех сообщений. Мне пришлось пойти в DispatchByBodyBehaviorAttribute и отредактировать ApplyDispatchBehavior(), чтобы добавить следующие строки, чтобы проверить это:

     if (qname.IsEmpty) {
         qname = new XmlQualifiedName(operationDescription.Messages[0].Body.Parts[0].Name, operationDescription.Messages[0].Body.Parts[0].Namespace);
     }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...