Wie zu verwenden IDispatchMessageInspector in einem WCF-Dienst?
Ich versuche, mit IDispatchMessageInspector in einer WCF-service-Implementierung für den Zugriff auf benutzerdefinierte header-Werte.
Etwas wie:
public class MyService : IMyService
{
public List<string> GetNames()
{
var headerInspector = new CustomHeaderInspector();
//Where do request & client channel come from?
var values = headerInspector.AfterReceiveRequest(ref request, clientChannel, OperationContext.Current.InstanceContext);
}
}
Habe ich umgesetzt, meine eigenen IDispatchMessageInspector Klasse.
public class CustomHeaderInspector : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
var prop = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];
var userName = prop.Headers["Username"];
return userName;
}
}
Wie gebe ich
-
System.ServiceModel.Kanäle.Nachricht und
-
System.ServiceModel.IClientChannel
zu AfterReceiveRequest genannt von der service-Implementierung?
EDIT:
Viele Artikel wie diese eine oder diese eine, geben Beispiele, wie die Umsetzung Ihrer eigenen ServiceBehavior
. So Ihr service-Implementierung sieht wie folgt aus:
[MyCustomBehavior]
public class MyService : IMyService
{
public List<string> GetNames()
{
//Can you use 'MyCustomBehavior' here to access the header properties?
}
}
Also mit diesem, kann ich auf MyCustomBehavior
irgendwie innerhalb der service operation Methode für den Zugriff auf benutzerdefinierte header-Werte?
- blogs.msdn.com/b/zelmalki/archive/2008/12/29/... dies kann sehr hilfreich sein
InformationsquelleAutor Didaxis | 2014-06-13
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Konfigurieren Sie die
Dann mit der Erweiterung behandelt werden in den WCF-stack. Der Dienst selbst hat keine Ahnung von der
serviceInterceptors
und Sie nicht haben, etwas zu tun, so wie in deinem ersten code-block. Die WCF-stack injizieren Sie Inspektor.MSDN: system.servicemodel.dispatcher.idispatchmessageinspector
Ich bin mit IClientMessageInspector für das gleiche Ziel.
Hier ist, wie Sie aus dem code:
Und hier ist die Beispiel-Implementierung von MessageInspector ich bin mit der Weitergabe der client-version zum server und abrufen der server-version im custom-Header:
Ich glaube, Sie brauchen nicht zu implementieren benutzerdefinierter IDispatchMessageInspector zum abrufen von benutzerdefinierten Header, es kann getan werden von service-operation-Methode so:
Macht es Sinn, zu implementieren benutzerdefinierter Versand Nachricht inspector, wenn Sie Abbrechen möchten, message-Verarbeitung, zum Beispiel, wenn die Anmeldeinformationen fehlen - Sie können nur werfen FaultException in diesem Fall.
Aber wenn Sie immer noch wollen, um pass " - Wert ab Versand der Nachricht, Inspektor, service operation Methode - wahrscheinlich ist es übergeben werden kann, durch einige singleton zusammen mit call-id (session-id), extrahiert werden später von der Methode, oder mit wcf-Erweiterungen
Was ich Tat, um Zugriff auf die details, die ich setzen Sie die folgenden in
IDispatchMessageInspector.AfterReceiveRequest
Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(username, "Membership Provider"), roles);
Habe ich es unterlassen die Authentifizierung code aus diesem.
Zugriff auf den Wert aus der service-Methode, die Sie aufrufen können
Thread.CurrentPrincipal.Identity.Name
Auf der MSDN-Seite, die Sie verlinkt dort auch eine Beschreibung, wie ein Inspektor eingesetzt werden kann und auch ein Beispiel. Zitat:
Später haben Sie die folgenden Beispiele:
Das sollte genug sein, zum du zu erhalten begannen. Ansonsten fühlen Sie sich frei, zu Fragen 🙂
Wenn Sie nur wollen, um Zugang zu den Header von Ihrem service, Sie könnten versuchen
OperationContext.Current.IncomingMessageHeaders
.