2011-06-21 11 views
9

Mam następujący kod w C#, który wygląda na apiKey w następującym SOAP nagłówka:Uzyskanie wartości w nagłówku SOAP z OperationContext

nagłówka SOAP:

<soap:Header> 
    <Authentication> 
     <apiKey>CCE4FB48-865D-4DCF-A091-6D4511F03B87</apiKey> 
    </Authentication> 
</soap:Header> 

C# :

Oto, co do tej pory miałem:

public string GetAPIKey(OperationContext operationContext) 
{ 
    string apiKey = null; 

    // Look at headers on incoming message. 
    for (int i = 0; i < OperationContext.Current.IncomingMessageHeaders.Count; i++) 
    { 
     MessageHeaderInfo h = OperationContext.Current.IncomingMessageHeaders[i]; 

     // For any reference parameters with the correct name. 
     if (h.Name == "apiKey") 
     { 
      // Read the value of that header. 
      XmlReader xr = OperationContext.Current.IncomingMessageHeaders.GetReaderAtHeader(i); 
      apiKey = xr.ReadElementContentAsString(); 
     } 
    } 

    // Return the API key (if present, null if not). 
    return apiKey; 
} 

PROBLEM: Wracając null zamiast rzeczywistej wartości apiKey:

CCE4FB48-865D-4DCF-A091-6D4511F03B87 

UPDATE 1:

dodałam trochę rejestrowanie. Wygląda na to, że h.Name jest w rzeczywistości "Uwierzytelnieniem", co oznacza, że ​​faktycznie nie będzie szukał "apiKey", co oznacza, że ​​nie będzie w stanie odzyskać wartości.

Czy istnieje sposób na pobranie <apiKey /> wewnątrz <Authentication />?

UPDATE 2:

Skończyło się za pomocą następującego kodu:

if (h.Name == "Authentication") 
{ 
    // Read the value of that header. 
    XmlReader xr = OperationContext.Current.IncomingMessageHeaders.GetReaderAtHeader(i); 
    xr.ReadToDescendant("apiKey"); 
    apiKey = xr.ReadElementContentAsString(); 
} 
+0

co wraca wtedy? Czy debugujesz aplikację i usługę internetową? Czy te same dane są osiągane w serwisie? –

+1

Spróbuj zarejestrować wartość h.Nazwa gdzieś –

+0

Dodałem rejestrację. Zobacz moją aktualizację powyżej. – fuzz

Odpowiedz

7

Myślę, że h.Name jest Authentication ponieważ jest rodzaj i apiKey korzeń jest własnością Authentication typu. Spróbuj zalogować wartości h.Name do pliku dziennika i sprawdź, co zwraca.

if (h.Name == "Authentication") 
{ 
    // Read the value of that header. 
    XmlReader xr = OperationContext.Current.IncomingMessageHeaders.GetReaderAtHeader(i); 
    //apiKey = xr.ReadElementContentAsString(); 
    xr.ReadToFollowing("Authentication"); 
    apiKey = xr.ReadElementContentAsString(); 
} 
+0

Proszę spróbuj zaktualizowanego kodu i daj mi znać. –

+1

Będziesz musiał użyć czegoś innego, wygląda na to, że twój XmlReader jest pusty, ponieważ OperationContext.Current.IncomingMessages przeczytał wszystko z XmlReader i jest pusty. Jakie właściwości są dostępne w typie MessageHeaderInfo? kiedy robisz h. , wszystko, co widzisz w intellisense, będziesz musiał użyć dowolnej z tych właściwości, aby uzyskać pożądany rezultat. –

+0

Musiałem użyć 'xr.ReadToDescendant (" apiKey ");' aby to działało poprawnie. Poprowadzisz mnie we właściwym kierunku. Dzięki. – fuzz

2

Skończyło się za pomocą następującego kodu:

if (h.Name == "Authentication") 
{ 
    // Read the value of that header. 
    XmlReader xr = OperationContext.Current.IncomingMessageHeaders.GetReaderAtHeader(i); 
    xr.ReadToDescendant("apiKey"); 
    apiKey = xr.ReadElementContentAsString(); 
} 
2

Jest krótsza rozwiązanie:

public string GetAPIKey(OperationContext operationContext) 
{ 
    string apiKey = null; 
    MessageHeaders headers = OperationContext.Current.RequestContext.RequestMessage.Headers; 

    // Look at headers on incoming message. 
    if (headers.FindHeader("apiKey","") > -1) 
     apiKey = headers.GetHeader<string>(headers.FindHeader("apiKey",""));   

    // Return the API key (if present, null if not). 
    return apiKey; 
} 
Powiązane problemy