2011-10-06 18 views
5

Próbuję podłączyć klucz API do OperationContext wychodzącego nagłówka wiadomości, co następuje:dodawania i usuwania danych z kontekstu żądanie

public static void AddApikeyToHeader(string apikey, IContextChannel channel, string address) 
    { 
     using (OperationContextScope scope = new OperationContextScope(channel)) 
     { 
      MessageHeader header = MessageHeader.CreateHeader("apikey", address, apikey); 
      OperationContext.Current.OutgoingMessageHeaders.Add(header); 

     } 
    } 

ale nie mam pojęcia jak pobrać nagłówek po stronie serwera . Używam menedżera autoryzacji usługi i uzyskać bieżący kontekst operacyjny i spróbować odzyskać nagłówek tak:

public string GetApiKey(OperationContext operationContext) 
    { 
     var request = operationContext.RequestContext.RequestMessage; 

     var prop = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]; 

     return prop.Headers["apikey"]; 
    } 

ale nie ma nagłówka apikey przymocowany tam. Ponadto podczas debugowania podczas sprawdzania operacjiContext nie widzę nagłówka apikey w dowolnym miejscu. Czy ktoś może zobaczyć, gdzie idę źle?

Odpowiedz

14

Możesz dodać niestandardowy nagłówek w ten sposób:

using (ChannelFactory<IMyServiceChannel> factory = 
     new ChannelFactory<IMyServiceChannel>(new NetTcpBinding())) 
     { 
     using (IMyServiceChannel proxy = factory.CreateChannel(...)) 
     { 
      using (OperationContextScope scope = new OperationContextScope(proxy)) 
      { 
      Guid apiKey = Guid.NewGuid(); 
      MessageHeader<Guid> mhg = new MessageHeader<Guid>(apiKey); 
      MessageHeader untyped = mhg.GetUntypedHeader("apiKey", "ns"); 
      OperationContext.Current.OutgoingMessageHeaders.Add(untyped); 

      proxy.DoOperation(...); 
      } 
     }      
    } 

i boczne serwis, można uzyskać nagłówek jak:

Guid apiKey = 
OperationContext.Current.IncomingMessageHeaders.GetHeader<Guid>("apiKey", "ns"); 
+0

Dzięki! Zorientowałem się, że mam problem, ponieważ nie wykonywałem usługi przez cały czas trwania kontekstu! – Dimitar

+0

Co to jest kanał usług? IMyServiceChannel? – PositiveGuy

+0

IMyServiceChannel to interfejs kanału komunikacyjnego między klientem a serwerem. –

1

Jestem zakładając, że starasz się zużywają swoje usługi za pomocą niektórych Transport oparty na protokole Http (SOAP, REST itp.). Zakładam również, że to, co chcesz, to autoryzacja osoby dzwoniącej za pomocą dostarczonego klucza API. Jeśli oba te warunki dotyczą Twojego pytania, możesz przeczytać dalej.

Niedawno miałem do czynienia z podobnym problemem tylko dlatego, że nie przekazałem klucza API, ale kombinacji hash nazwy użytkownika/hasła za pomocą niektórych niestandardowych nagłówków HTTP. Ostatecznie rozwiązałem go, wprowadzając niestandardową strategię autoryzacji, która po skonfigurowaniu w Web.config ładnie trafiła do potoku WCF.

Poniższy fragment powinien wystarczyć do rozpoczęcia pracy. Prawdopodobnie musiałbyś zamienić nagłówki x-ms-credentials-XXX na jeden reprezentujący twój klucz API.

Powiązane problemy