Подтвердить что ты не робот

Проблема с клиентом WCF, вызывающим одностороннюю операцию

У меня возникла проблема при вызове веб-сервиса на шине SAP PI от моего клиента WCF. Операция определяется как односторонняя, а метод моего контракта с оператором-посредником оформляется соответствующим образом при добавлении ссылки на службу. Тем не менее, клиент службы получает исключение при вызове соответствующей операции:

Односторонняя операция возвратила ненулевое сообщение с Action = ''

Используя SoapUI, метод на шине можно вызвать успешно и возвращает SOAP-конверт с пустым телом. Люди автобуса сказали мне, что это соответствует спецификациям SOAP:


(спецификации SOAP, глава 4.7.9, односторонние операции):

Существуют разные интерпретации того, как HTTP должен использоваться при выполнении односторонних операций.

R2714 Для однонаправленных операций INSTANCE НЕ ДОЛЖНА возвращать HTTP-ответ, содержащий конверт. В частности, тело-ответчик HTTP-сообщения должно быть пустым.

R2750 ПОТРЕБИТЕЛЬ ДОЛЖЕН игнорировать конверт, переданный в ответном сообщении HTTP в односторонней операции.

R2727. Для однонаправленных операций ПОТРЕБИТЕЛЬ НЕ ДОЛЖЕН интерпретировать успешный код статуса ответа HTTP (т.е. 2xx), чтобы означать, что сообщение действительно или что получатель обработает его.


Итак, мой WCF-клиент не соответствует R2750.

Я выяснил, что, когда я принуждаю оператор операции к прокси-серверу быть IsOneWay = false, все работает.

Есть ли что-то неправильное в том, как WCF обрабатывает односторонние операции или я делаю что-то неправильно (скорее)? Есть ли что-то еще, что я должен делать, просто не представляется прав переопределять созданный клиент прокси-сервера WCF.

Спасибо за любые предложения.

4b9b3361

Ответ 1

Похоже, что SAP PI неправильно отправляет пустой SOAP-конверт, а .NET неправильно интерпретирует этот конверт.

Некоторые параметры этот поток:

  • изменить сгенерированный прокси-сервер и удалить OneWay = true (или добавить OneWay = false) в определение метода
  • уловить нарушение протокола в обработчике исключений и игнорировать его
  • используйте веб-ссылку стиля 2.0 для вызова службы
  • применить патч SAP Примечание 1459995 - Adapter Adapter HTTP 202 и добавить & responsecode202 = true для URL

Первый и последний варианты работали для меня. Дальнейшее обсуждение этой sap.com.

Ответ 2

Я бы посмотрел на эту статью, а также на Gerben van Loon здесь. Односторонняя операция может быть не в порядке, в соответствии со стандартами.

Ответ 3

Отметьте этот поток SAP для полного обсуждения: http://scn.sap.com/thread/1627368

@Brian Low ответил на этот вопрос правильно и очень тщательно (должен быть отмечен как ответ).

Я также хотел бы добавить, что это известная ошибка, при которой адаптер SOAP не соответствует вышеупомянутому базовому профилю WS-I 1.1 (R2750) и WCF не соответствует (R2750). Результат... Время расточительного времени и скрежет зубов....

Ответ 4

Я считаю, что эту конкретную проблему можно устранить, добавив следующее объявление атрибута к операции в клиентской porxy:

[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]

Ответ 5

Не видя, как выглядит подзапись метода, я думаю, что ваш метод решил вернуть что-то другое, чем "пустое". Поскольку операция является односторонней, метод может быть определен только с помощью "void" (не имеет возврата). Что-то еще, и операция НЕ односторонняя.