Подавление глаголов в исходящем сообщении в транспорте WCF-WebHttp

Я практикую здесь учебник — Вызов интерфейса REST с помощью BizTalk Server

На этой странице шаг 3(e) указывает предоставить GET в качестве команды, которая должна быть подавлена ​​в исходящем сообщении для свойства - Suppress Body for Verbs. Приведенное объяснение мне непонятно.

В качестве эксперимента я удалил команду GET и удалил входной файл. Приложение было приостановлено со следующей ошибкой:

System.Net.ProtocolViolationException: Cannot send a content-body with this verb-type.

Server stack trace: 
at System.Net.HttpWebRequest.CheckProtocol(Boolean onRequestStream)
at System.Net.HttpWebRequest.BeginGetRequestStream(AsyncCallback callback, Object state)
at System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStreamAsyncResult..ctor(HttpWebRequest httpWebRequest, HttpOutput httpOutput, AsyncCallback callback, Object state)
at System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.BeginGetOutputStream(AsyncCallback callback, Object state)
at System.ServiceModel.Channels.HttpOutput.SendAsyncResult.SendWithoutChannelBindingToken()
at System.ServiceModel.Channels.HttpOutput.SendAsyncResult.Send()
at System.ServiceModel.Channels.HttpOutput.SendAsyncResult..ctor(HttpOutput httpOutput, HttpResponseMessage httpResponseMessage, Boolean suppressEntityBody, TimeSpan timeout, AsyncCallback callback, Object state)
at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.StartSend(Boolean completedSynchronously)
at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.Begin()
at System.ServiceModel.Channels.ServiceChannel.BeginCall(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, TimeSpan timeout, AsyncCallback callback, Object asyncState)
at System.ServiceModel.Channels.ServiceChannel.BeginRequest(Message message, TimeSpan timeout, AsyncCallback callback, Object state)
at System.ServiceModel.Channels.ServiceChannel.BeginRequest(Message message, AsyncCallback callback, Object state)

Exception rethrown at [0]: 
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at System.ServiceModel.Channels.IRequestChannel.BeginRequest(Message message, AsyncCallback callback, Object state)
at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfClient`2.SendRequestMessage(IBaseMessage bizTalkMessage, IRequestChannel channel)
at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfClient`2.SendMessage(IBaseMessage bizTalkMessage) 
MessageId:  {9FA7042A-0391-4AAF-946F-FE9C5516ABFD}
InstanceID: {4C29E43D-278A-4615-8A30-4ED1B1CBC2AD}

Зачем это нужно и что именно происходит, когда я не подавляю это?


person FMFF    schedule 29.04.2015    source источник


Ответы (2)


По умолчанию BizTalk отправляет полезные данные сообщения (тело содержимого) при отправке.

Когда вы пытаетесь использовать службу RESTful и хотите выполнить GET, вы обычно не хотите отправлять полезную нагрузку сообщения, вы просто слишком извлекаете содержимое из URL-адреса, поэтому вы хотите подавить отправку тела содержимого.

См. соответствующий вопрос Невозможно отправить тело содержимого с помощью этого типа глагола

Что произойдет, если вы отправите тело содержимого с запросом GET, может быть разным. Некоторые прокси-серверы могут исказить запрос или привести к ошибке, или конечный сервер может выдать исключение, поскольку он не ожидал тела содержимого.

person Dijkgraaf    schedule 29.04.2015

Вам нужно подавить тело, а не глагол. Здесь создан и доступен специальный компонент конвейера: https://code.msdn.microsoft.com/biztalk-2010-r2-rest-wcf-fdb2e91f, чтобы сделать это за вас.

person Dan Field    schedule 30.04.2015