2009-03-13 4 views
20

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

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

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


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

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

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

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

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


Таким образом, мой клиент WCF не соответствует R2750.

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

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

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

+2

Большой вопрос +1. Я бы сказал, что их сторона не соответствует требованиям R2714. Пожалуйста, подумайте о том, чтобы зарегистрировать инцидент с Microsoft и сообщить нам, какой результат. –

+0

Аналогичный вопрос (и больше информации): http://stackoverflow.com/q/4510484/46039 –

+0

Ссылка на спецификацию SOAP 4.7.9 Односторонние операции: http://www.ws-i.org/profiles/basicprofile -1.1.html –

ответ

11

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

Некоторые варианты от this thread:

  • изменить сгенерированный прокси и удалить OneWay = истина (или добавить OneWay = ложь) в определении метода
  • поймать Нарушение протокола в качестве обработчика исключений и игнорировать его
  • использовать webreference 2,0 стиля для вызова службы
  • применять SAP патч Note 1459995 - Soap Sender Adapter HTTP 202 и добавить & responsecode202 = истинные к URL

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

+0

Спасибо за это, это по-прежнему актуально для меня. –

+0

Это ответ, спасибо за помощь! – SDeezy

+0

Я думаю, что с точки зрения системы вызов веб-службы всегда должен отвечать на запрос с подтверждением. Истина или ложь, 1 или 0, чтобы указать, что ваше сообщение было получено и обработано с другой стороны. –

4

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

+0

Спасибо за эту ссылку –

+1

Семантика веб-вызовов oneway через 'SOAP' сопоставима с' void() 'not fire-and forget. Подобно методу, который возвращает 'void()' вызов блокирует и имеет возможность «вернуть» исключение. –

0

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

[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]

+0

Спасибо за ваш ответ. Однако добавление этого к созданному клиентскому прокси-серверу примерно такое же, как установка свойства OneWay на false. И, к сожалению, это не сработало. –

0

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

+0

Метод фактически возвращает void –

1

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

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

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