2017-03-10 2 views
0

Ich habe einen Wrapper für einen WCF-Dienst mit einer Reihe von Methoden. Bei jeder Methode bin ich eine sessionId und eine deviceId zur Authentifizierung einfügen. Diese Werte ändern sich bei der Instanziierung und Sie sollten sie nach dem Beenden wieder löschen.So ändern Sie SOAP-Header bei jedem Methodenaufruf

Ich bin mir bewusst, dass Sie dies tun können, die Header eines Anrufs zu ändern:

using (var scope = new OperationContextScope((IClientChannel)this.client.InnerChannel)) 
{ 
    WebOperationContext.Current.OutgoingRequest.Headers.Add("SessionId", this.sessionId); 
    WebOperationContext.Current.OutgoingRequest.Headers.Add("DeviceKey", this.deviceKey.ToString()); 
    return this.client.MyMethod("call"); 
} 

Ich will nicht diese 20-mal einzufügen. Gibt es eine Möglichkeit, dies sauber zu machen? Ich kann wahrscheinlich Reflection verwenden und aufrufen. Aber meine Methoden haben keine einheitlichen Werte und Argumente.

public class Service { 
    private string sessionId; //needed for auth 
    private string deviceId; // needed for auth 
    public Service (string userName, string password) {} 

    public string[] GetList() {} 
    public Foo[] GetSomethingElse(Bar arg) {} 
    public List<Baz> GetTheThing(Fez org) {} 
    // etc... x 20 
} 
+0

ein smidge datiert registrieren Dies ist, aber es könnte Ihnen einige Ideen: https://blogs.msdn.microsoft.com/carlosfigueira/ 2011/03/14/wcf-erweiterbarkeit / –

Antwort

0

Wahrscheinlich, was Sie suchen, ist IClientMessageInspector und seine Methode BeforeSendRequest.

Von hier aus konnte man so etwas wie diese

public object BeforeSendRequest(ref Message request, IClientChannel channel) 
{ 
    HttpRequestMessageProperty prop; 
    if (request.Properties.ContainsKey(HttpRequestMessageProperty.Name)) 
    { 
     prop = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]; 
    } 
    else 
    { 
     prop = new HttpRequestMessageProperty(); 
     request.Properties.Add(HttpRequestMessageProperty.Name, prop); 
    } 

    prop.Headers.Add("SessionId", this.sessionId); 
    prop.Headers.Add("DeviceKey", this.deviceKey.ToString()); 

} 

Vor dem Senden jede Nachricht tun (als Methode Name schon sagt) es wird entsprechend Header ändern.

OGH, aand hier ist der Link, wie Sie Klasse Implementierung dieser Schnittstelle link

Verwandte Themen