Проблема с клиентом WCF, вызывающим одностороннюю операцию - PullRequest
21 голосов
/ 13 марта 2009

Я столкнулся с проблемой при вызове веб-службы на шине 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.

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

Ответы [ 5 ]

12 голосов
/ 13 февраля 2013

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

Некоторые опции из этой темы :

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

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

4 голосов
/ 19 декабря 2010

Я бы тоже посмотрел эту статью Гербена ван Луна здесь . Односторонняя операция в действительности не может быть односторонней в соответствии со стандартами.

1 голос
/ 07 декабря 2013

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

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

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

0 голосов
/ 31 мая 2011

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

0 голосов
/ 27 мая 2011

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

[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]

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