2010-11-22 5 views
2

Ich muss einen Kanal in meinem WCF-Dienst identifizieren.WCF - Wie bekomme ich eine Kanalkennung?

Ein Weg ist, Session.SessionID zu verwenden, aber ich kann nicht scheinen, die Bindung mit Sitzungen zu arbeiten, und die Sitzung scheint zu viel für das, was ich versuche zu erreichen. Ich versuche nur, die Geschichte eines Kanals aufzuschreiben - welche Methoden aufgerufen werden und einen Hash von "Kanal-IDs", die gerade aktiv sind.

Wie kann ich etwas wie 'Kanal ID' bekommen? Ich weiß, dass die "Kanal-ID" nicht explizit existiert, aber was sind die Problemumgehungen?

+0

Was ist der Anwendungsfall, was willst du damit erreichen? –

+0

Wie ich geschrieben habe - ich versuche eine Log-in-Geschichte-Tabelle basierend auf Kanal-ID, die aufspüren würde, welche Methoden auf jedem Kanal aufgerufen wurden, während es geöffnet wurde. Auch, um zu verfolgen, welche Kanäle geöffnet sind (es ist für einige Geschäftslogik). – veljkoz

+0

Wenn ich mich nicht irre, hat der Autor keinen SessionMode, so dass er nicht auf OperationContext.Current zugreifen kann, um den Sitzungsrückruf oder andere Informationen abzurufen. –

Antwort

2

Da nichts anderes ist der Trick, ich ‚betrogen‘ es wie folgt aus:

hinzufügen Message auf der Client-Seite:

using (OperationContextScope scope = new OperationContextScope(cli.InnerChannel)) 
{ 
    OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("MyHeader", Guid.NewGuid().ToString(), "")); 

    string ret = cli.GetData(1); 
} 

In der Eigenschaft „Name“ des Headers habe ich den Namen der Kopfzeile, die ich weitergeben möchte, und ich benutze den Namespace als Werthalter (da ich scheinbar nicht zu diesem "Wert" der Kopfzeile komme - er wird nicht als Eigenschaft angezeigt ?!). Ich mache das auf der Client-Seite jedes Mal, wenn ich eine Service-Instanz erstelle.

Dienst für las ich den Header wie:

var head = OperationContext.Current.IncomingMessageHeaders.FirstOrDefault(h => h.Name == "MyHeader"); 
string channelId = head.Namespace; 

Es ist definitiv ein Hack, aber ich bin aus der Zeit, etwas eleganter zu schaffen, und dies ermöglicht es mir, ‚Kanal-ID‘ die Art und Weise zu halten I steuern kann es ... es ist eine hässliche Lösung, und ich mag es nicht, wenn jemand so etwas besseres findet würde ich es zu schätzen wissen ...

bearbeiten: ich habe versucht, Outgoing/IncomingMessageProperties verwenden, aber das doesn‘ Es scheint zu funktionieren - es ist nirgends auf der Server-Seite zu finden ... Ich vermisse wahrscheinlich etwas ...

+3

So erhalten Sie den Header-Wert, ohne ihn über den Namespace zu hacken: Guid myChannelID = OperationContext.Current.IncomingMessageHeaders.GetHeader ("MyHeader", "http: // Beispiel/meine-header /"); –

+0

@velijkov: All meine Weihnachten sind sofort gekommen. ty. –

0

Haben Sie versucht string sessionID = OperationContext.Current.SessionId;?

+0

Das existiert nicht, wenn es keine Sitzung gibt, die ist mein Fall - und ich will nicht wirklich Sitzung. – veljkoz

+0

Da Sie keine Sitzungen verwenden, können Sie nur die Rückrufadresse, die aufgerufene Schnittstelle und die aktuelle Uhrzeit protokollieren. Sind Sie danach? –

+0

Rückruf-Adresse könnte genug sein, aber ich bin mir nicht sicher, ob es den Benutzer/Kanal gültig identifizieren wird? Was ist, wenn der Benutzer zwei Anwendungen hat, die den Dienst nutzen? Es gibt keine Möglichkeit, zwischen ihnen zu unterscheiden – veljkoz

0

Es klingt wie OperationContext.Current.Channel.GetHashCode() könnte Ihrem Zweck entsprechen.

+0

Dies gibt immer den gleichen Hash-Wert für jeden Kanal zurück. Was mich zu der Schlussfolgerung bringt, dass der Kanal nichts enthält, was ihn von anderen Kanälen unterscheidet. – veljkoz

+0

... oder werden alle Ihre Anfragen auf demselben Kanal bearbeitet? Welche Bindung verwendest du? –

+0

basicHttpBinding - aber selbst wenn ich die App neu starte, bleibt der Channel-Hash der gleiche. – veljkoz

Verwandte Themen