Я пытаюсь создать общее местоположение получения BizTalk (WCF-WSHttp), которое принимает любой вызов веб-службы для методов, возвращающих "void" .(Расположение является общим, потому что BizTalk пересылает сообщение в реальную реализацию сервиса)
Я знаю, что истинные односторонние операции не поддерживаются (за исключением WCF MSMQ), поэтому операция имеет [OperationContract (IsOneWay =false)]
Я могу вызвать универсальную службу с клиентом WCF, и BizTalk правильно обрабатывает сообщение.Однако BizTalk затем возвращает ответ, который клиент не распознает, и клиенты выдают следующее исключение:
System.ServiceModel.CommunicationException: Ошибка в десериализации тела ответного сообщения для операции «MyOperationName». OperationFormatter не может десериализовать какую-либо информацию из сообщения, поскольку сообщение пустое (IsEmpty = true).
Это пример ответа, который клиент может распознать (протестировановызов реализации службы напрямую, без использования BizTalk в качестве посредника):
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1"/>
<a:RelatesTo>urn:uuid:102509d6-15c6-4959-9a98-b714d5d16a1f</a:RelatesTo>
</s:Header>
<s:Body>
<MyOperationResponse xmlns="http://mynamespace"/>
</s:Body>
</s:Envelope>
Однако, вот пример ответа, который возвращает BizTalk:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:RelatesTo>urn:uuid:9e794c0c-65f0-4807-b1f2-84a30587df9b</a:RelatesTo>
</s:Header>
<s:Body/>
</s:Envelope>
(я использую один-wayway location, поэтому мне не нужно было писать код, чтобы это возвращалось)
Это имеет два отличия от XML, ожидаемого клиентом:
Я вижу два способа решения этой проблемы:
- Измените контракт операции (интерфейс C #), чтобы ожидать пустой ответ / никаких действий вместочто он в настоящее время ожидает.
- Сконфигурируйте BizTalk для возврата XML, который ожидает клиент
Любые идеи о том, как получить решение 1 или решение 2?
Для решения 1 япопытался поиграть с атрибутом [OperationContract (ReplyAction = ...)], но не смог найти способ сделать это.