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

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

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

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


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

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

R2714 Для односторонних операций ЭКЗЕМПЛЯР НЕ ДОЛЖЕН возвращать HTTP-ответ, содержащий конверт. В частности, тело объекта HTTP-ответа должно быть пустым.

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

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


Похоже, мой клиент WCF не соответствует требованиям R2750.

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

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

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


person kay.herzam    schedule 13.03.2009    source источник
comment
Отличный вопрос +1. Я бы сказал, что их сторона тоже не соответствует требованиям R2714. Сообщите нам об инциденте и сообщите нам, каков результат.   -  person Jerry Bullard    schedule 04.09.2009
comment
Аналогичный вопрос (и дополнительная информация): stackoverflow.com/q/4510484/46039   -  person Brian Low    schedule 13.02.2013
comment
Ссылка на спецификацию SOAP 4.7.9 Односторонние операции: ws-i.org/ профили / basicprofile-1.1.html   -  person Brian Low    schedule 13.02.2013


Ответы (5)


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

Некоторые варианты из этой ветки:

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

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

person Brian Low    schedule 13.02.2013
comment
Спасибо за это, до сих пор актуально для меня. - person kay.herzam; 14.02.2013
comment
Я думаю, что с точки зрения системы вызов веб-службы всегда должен отвечать подтверждением. Верно или неверно, 1 или 0, чтобы указать, что ваше сообщение было получено и обработано с другой стороны. - person Adrian Hedley; 06.10.2016
comment
Последний вариант работал у меня с SAP PI 7.3.1 и .NET 4.7.2 - person Anton Krouglov; 16.04.2019

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

person Bryan Corazza    schedule 19.12.2010
comment
Семантика односторонних веб-вызовов через SOAP сравнима с void() не «выстрелил и забыл». Так же, как метод, который возвращает void(), вызов является блокирующим и имеет возможность возвращать исключение. - person Ethan Cabiac; 27.05.2011


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

[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]

person Ethan Cabiac    schedule 27.05.2011
comment
Спасибо за Ваш ответ. Однако добавление этого к сгенерированному клиентскому прокси примерно такое же, как установка для свойства OneWay значения false. К сожалению, это не сработало. - person kay.herzam; 30.05.2011

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

person Russ    schedule 31.05.2011
comment
Метод фактически возвращает void - person kay.herzam; 01.06.2011