Первый сервер WSDL WCF, куда клиент не отправляет SOAPAction

Я реализую веб-сервис 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?

6
задан Lawrence Johnston 10 May 2010 в 19:35
поделиться

1 ответ

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

  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);
     }
    
18
ответ дан 8 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: