Nicht Lesen können Kopfzeilen in den WCF-Dienst

Ich versuche, fügen Sie einen benutzerdefinierten Sicherheits-feature, wo der client fügt einen token für jeden service-Aufruf von einem Silverlight-client und dann den Dienst zugreifen können dieses token zur Steuerung einer Anwendung-Sicherheit-system. Ich bin versucht, dies zu tun, durch die Umsetzung der IClientMessageInspector-Schnittstelle und verbindet diese in meinem generierten service-client. Ich bin nicht mit den von Visual studio generierten proxy aber mein eigenen client erstellt eine ChannelFactory. Ich habe es geschafft, zu finden einige Lösungen im web, die alle scheinen, um die Verwendung eines 2 grundlegende Methoden. Erstens, indem ein header in die Header-Sammlung von der Botschaft der IClientMessageInspector.BeforeSendRequest, und zweitens durch die Verwendung eines HttpRequestMessageProperty hinzufügen der info-als eine Eigenschaft, um die Botschaft der IClientMessageInspector.BeforeSendRequest. Ich habe versucht, beides ohne Erfolg. Es scheint, dass beide Techniken erfolgreich das hinzufügen von Daten in die Anfrage, aber ich habe keinen Zugriff auf entweder auf dem server. Ich möchte hinzufügen, dass dies ein ganz neuer Bereich für mich und es ist sehr gut möglich, dass ich verpasst haben, die Antwort auf das internet aufgrund von Unerfahrenheit.

Den code zu generieren mein client ist:

    private ISecurityAdministrationContract CreateChannel()
    {
        if (factory == null)
        {
            lock (this)
            {
                //Create a custom binding that uses HTTP and binary encoding.
                var elements = new List<BindingElement>();
                elements.Add(new BinaryMessageEncodingBindingElement());
                elements.Add(new HttpTransportBindingElement());
                var binding = new CustomBinding(elements);

                //Create a channel factory for the service endpoint configured with the custom binding.
                factory = new ChannelFactory<ISecurityAdministrationContract>(binding, new EndpointAddress(SecurityAdminServiceAddress));

                //Add my IClientMessageInspector
                factory.Endpoint.Behaviors.Add(new ClientSecurityInterceptor());
            }                
        }
        ISecurityAdministrationContract client = factory.CreateChannel();
        return client;
    }
        }
        ISecurityAdministrationContract client = factory.CreateChannel();
        return client;
    }

Den code, um meinen header, um die Anforderung ist:

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
    {
        //Method 1
        MessageHeader header = MessageHeader.CreateHeader("MyFirstAuthentication", "ns", "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEEE");
        request.Headers.Add(header);

        //Method 2
        HttpRequestMessageProperty httpRequestMessage;
        httpRequestMessage = new HttpRequestMessageProperty();
        httpRequestMessage.Headers["MySecondAuthentication"] = "11111111-2222-3333-4444-5555555555555";
        request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);

        return null;
    }

Den obigen code implementiert beide Techniken.

Den service-Aufruf gefangen von fiddler ist: (NB http ersetzt mit ht_tp cos die Website wird nicht lassen Sie mich auf post hyoerlinks)

POST ht_tp://127.0.0.1:6785/SecurityAdministrationRelayService.svc/HTTP/1.1
Akzeptieren: /
Referer: ht_tp://ipv4.fiddler:6785/ClientBin/Civica.Gehäuse.xap
Accept-Language: en-gb
Content-Length: 400
Content-Type: application/soap+msbin1
MySecondAuthentication: 11111111-2222-3333-4444-5555555555555
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB5; InfoPath.2; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727)
Host: 127.0.0.1:6785
Connection: Keep-Alive
Pragma: no-cache

V_
s
_a_V_D
���Ahttp://tempuri.org/ISecurityAdministrationContract/CreateAdvocateD�ߔ_�9�HJ��9��-��D,D*�@MyFirstAuthentication_ns�%AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEEED
_���@http://ipv4.fiddler:6785/SecurityAdministrationRelayService.svc/V@_CreateAdvocate_http://tempuri.org/@
advocateVO�
{"Id":0,"UserId":4,"AdvocateForId":8,"ValidFrom":"/Date(1291127869690+0000)/","ValidTo":null}__

Dies scheint zu enthalten das token info für beide Techniken.

Das problem kommt auf dem server wenn ich versuche, zu extrahieren, diese info. Ich habe implementiert eine IOperationInvoker und versuchte den Kopf in die IncomingMessageHeaders ohne Erfolg. Ich habe auch gesucht, in der IncomingMessageProperties aber ich kann nicht sehen, jeder meiner zusätzlichen header detail.
Dies ist der code, den ich verwende in der IOperationInvoker:

    public object Invoke(object instance, object[] inputs, out object[] outputs)
    {
        PreInvoke(instance, inputs);
        object returnedValue = null;
        object[] outputparams = new object[] { };
        Exception exception = null;
        try
        {
            returnedValue = originalInvoker.Invoke(instance, inputs, out outputparams);
            outputs = outputparams;
            return returnedValue;
        }
        catch (Exception e)
        {
            exception = e; throw;
        }
        finally
        {
            PostInvoke(instance, returnedValue, outputparams, exception);
        }
    }


    protected virtual void PreInvoke(object instance, object[] inputs)
    {
        //Look for header directly
        int index = System.ServiceModel.OperationContext.Current.IncomingMessageHeaders.FindHeader("MyFirstAuthentication", "ns");

        //Search via enumerator
        foreach (var header in System.ServiceModel.OperationContext.Current.IncomingMessageHeaders)
        {
        }

    }

Den FindHeader gibt -1 zurück, während der enumerator findet 5 Kopfzeilen, nämlich 'Action', 'MessageID', 'ReplyTo', 'VsDebuggerCausalityData' & 'Zu'.

OperationContext.Aktuelle.IncomingMessageProperties Sammlung enthält 4 Einträge, nämlich: 'Über', 'Sicherheit', 'Encoder' & 'System.ServiceModel.- Kanäle.RemoteEndpointMessageProperty'

In der Tat, wenn ich kommentieren Sie die Zeile in meiner client fügt hinzu, dass die IClientMessageInspector der ClienChannel dann die http -, dass fiddler meldet änderungen durch das weglassen der Details Hinzugefügt, aber die Kopf-und Eigenschaft-Sammlungen auf die Eingehende Nachricht unverändert sind.

Irgendwelche Ideen, wie ich Zugriff auf diese info, oder warum ist es nicht so präsentiert, als Teil der IncomingMessage wäre sehr dankbar angenommen.

InformationsquelleAutor Roger Adams | 2010-11-30
Schreibe einen Kommentar