2017-01-26 5 views
1

Я импортировал WSDL в свой проект C# .NET. После этого мне пришлось создать токен доступа, и теперь я должен использовать этот токен через заголовок авторизации при вызове службы SOAP. Есть ли простой способ этого?Заголовок авторизации в вызове SOAP

MemberAccountPortClient clientTransaction = new MemberAccountPortClient ("SERVICE"); 
SearchTransactionResponseType res = clientTransaction.searchTransaction (OBJECT_1, OBJECT_2); 

Как добавить заголовок авторизации в этом случае?

ответ

0

Вы можете создать IClientMessageInspector/IEndpointBehavior, чтобы установить это значение следующим образом: (да этот код многословен, но это так, как WCF работает;)

public class AuthorizationHeaderMessageInspector : IClientMessageInspector, IEndpointBehavior 
{ 
    object IClientMessageInspector.BeforeSendRequest(ref Message request, IClientChannel channel) 
    { 
     HttpRequestMessageProperty prop; 
     Object obj; 
     if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out obj)) 
     { 
      prop = (HttpRequestMessageProperty)obj; // throws a cast exception if invalid type 
     } 
     else 
     { 
      prop = new HttpRequestMessageProperty(); 
      request.Properties.Add(HttpRequestMessageProperty.Name, prop); 
     } 
     prop.Headers[HttpRequestHeader.Authorization] = "your authorization value here"; 

     return null; 
    } 

    void IClientMessageInspector.AfterReceiveReply(ref Message reply, object correlationState) 
    { 
    } 

    void IEndpointBehavior.AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 
    { 
    } 

    void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
    { 
     clientRuntime.MessageInspectors.Add(this); 
    } 

    void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) 
    { 
    } 

    void IEndpointBehavior.Validate(ServiceEndpoint endpoint) 
    { 
    } 
} 

Затем, когда вы создаете ваш клиент добавить сообщение инспектор следующим образом:

MemberAccountPortClient clientTransaction = new MemberAccountPortClient ("SERVICE"); 
clientTransaction.Endpoint.Behaviors.Add(new AuthorizationHeaderMessageInspector()); 
SearchTransactionResponseType res = clientTransaction.searchTransaction (OBJECT_1, OBJECT_2); 

Я считаю, что WCF имеет способ применить IEndpointBehavior, используя конфигурацию, как хорошо, но я обычно иду прямо кода для этих типов вещей.

+1

Большое спасибо @dana! – Crasher

Смежные вопросы