Проблема с клиентом 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.
Спасибо за любые предложения.
Ответы
Ответ 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" (не имеет возврата). Что-то еще, и операция НЕ односторонняя.