2016-08-12 29 views
9

Uderzam w usługę WCF przy użyciu pliku WSDL, do którego nie mam dostępu i którego nie można zmodyfikować. Dla jednego z wniosków zdalny serwis jest umierających ponieważ jesteśmy wysyłania:Węzeł czynności musi zostać usunięty z żądania mydła WCF za pomocą IClientMessageInspector

<Action s:mustUnderstand="1"....> 

Po poszukiwanej obszernie nie mogę znaleźć proste rozwiązanie mojego problemu. Więc w typowym komunikatem:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none" /> 
    </s:Header> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <retrieveBooking xmlns="http://services.rccl.com/Interfaces/RetrieveBooking"> 
     <OTA_ReadRQ TransactionActionCode="RetrievePrice" SequenceNmbr="1" Version="1" xmlns="http://www.opentravel.org/OTA/2003/05/alpha"> 

Pomyślałem mogę usunąć ten węzeł jako część wiadomości inspektora:

internal class MyMessageInspector : IClientMessageInspector 
{ 
    public object BeforeSendRequest(ref Message aRequest, IClientChannel aChannel) 
    { 
     //Get rid of mustUnderstand Action node 
     foreach (MessageHeaderInfo headerInfo in aRequest.Headers.UnderstoodHeaders) 
     { 
      aRequest.Headers.UnderstoodHeaders.Remove(headerInfo); 
     } 

     return null; 
    } 
} 

jednak chociaż aRequest.Headers.UnderstoodHeaders jest pusty po tym, jak usunąć wszystkie elementy, wciąż widzę węzeł Akcji emitowany w XML.

  1. Co muszę zrobić, aby to zadziałało?
  2. Jak mogę dostać w treści wiadomości tak, że mogę sprawdzić nazwę pierwszego węzła znacznika body retrieveBooking w tym przypadku? (Muszę tylko wykonać to dla konkretnej wiadomości, nie wszystkie z nich)

Odpowiedz

1

A ostatecznie odpowiedź jest bardzo prosta.

public object BeforeSendRequest(ref Message aRequest, IClientChannel aChannel) 
{ 
    //For the CabinDetail message the API provider has requested that we REMOVE the XML action node from the header as it causes their end to fail 
    //<s:Header> 
    //<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none" /> 
    //</s:Header> 
    if (aRequest.ToString().Contains("CabinDetail")) 
    { 
     int headerIndexOfAction = aRequest.Headers.FindHeader("Action", "http://schemas.microsoft.com/ws/2005/05/addressing/none"); 
     aRequest.Headers.RemoveAt(headerIndexOfAction); 
    } 

    return null; 
}