Ошибка Невозможно установить нулевые или пустые методы по запросу. в пользовательском поведении WCF

Я работаю над WCF CustomBehavior, который подключается к BizTalk 2010 SendPort для вызова службы JSON/REST. SendPort — это WCF/Custom с типом привязки = webHttpBinding.

Мне нужно добавить четыре заголовка к запросу.

Когда я включаю этот код в свой метод BeforeSendRequest:

var newHttpRequestMessageProperty = new HttpRequestMessageProperty
{
    Method = request.Headers.Action,
    QueryString = string.Empty,
    SuppressEntityBody = false,

};

newHttpRequestMessageProperty.Headers.Add("X-ST-PartnerID", partnerIDFromSSO);
newHttpRequestMessageProperty.Headers.Add("X-ST-Token", tokenIDFromSSO);
newHttpRequestMessageProperty.Headers.Add("X-ST-AuthType", "TOKEN");
newHttpRequestMessageProperty.Headers.Add("Accept-Language", "EN");

request.Properties[HttpRequestMessageProperty.Name] = newHttpRequestMessageProperty;

Это дает мне эту ошибку:

System.ArgumentException: Cannot set null or blank methods on request.
Parameter name: value

Server stack trace: 
   at System.Net.HttpWebRequest.set_Method(String value)
   at System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.PrepareHttpSend(Message message)
   at System.ServiceModel.Channels.HttpOutput.BeginSendCore(HttpResponseMessage httpResponseMessage, TimeSpan timeout, AsyncCallback callback, Object state)
   at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelAsyncRequest.SendWebRequest()
   at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelAsyncRequest.OnGetWebRequestCompleted(IAsyncResult result)
   at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelAsyncRequest.BeginSendRequest(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.BeginRequest(Message message, TimeSpan timeout, AsyncCallback callback, Object state)
   at System.ServiceModel.Dispatcher

Когда я оставляю этот код, я получаю ответ 415 от веб-службы партнера, поэтому я знаю, что по крайней мере доберусь туда.

То, что я делаю, похоже на этот пост: Как добавить собственный HTTP-заголовок к каждому вызову WCF?


person NealWalters    schedule 17.08.2016    source источник


Ответы (1)


У коллеги поменял:

     //Method = request.Headers.Action,
     Method = "POST",

и это сработало...

Причина заключалась в том, что когда у вас есть недопустимое «Имя операции», тогда в request.Headers.Action была вся строка CustomAction из порта отправки BizTalk:

<BtsActionMapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Operation Name="DELETE" Action="DELETE" />
  <Operation Name="GET" Action="GET" />
  <Operation Name="POST" Action="POST" />
</BtsActionMapping>

Я моделирую свой код по образцу здесь: https://biztalkrest.codeplex.com/discussions/657185< /а>

После вышеупомянутого исправления меня осенило, чтобы сопоставить «Имя операции» в логическом порту оркестровки, и, конечно же, у меня было «Post» вместо «POST». Угхх... Итак, очевидно, когда OperationName не совпадает с операциями CustomAction, BizTalk просто отправляет весь XML-блок CustomAction через... Удивительно...

На картинке ниже показано, как я изменил «Post» на «POST».

введите здесь описание изображения

person NealWalters    schedule 17.08.2016