Ich entschuldige mich für die vorherige Antwort, ich nahm dummerweise an, dass ich gerade WebOperationContext gecastet habe, um den OperationContext zu bekommen, leider ist die wirkliche Antwort viel hässlicher.
Lassen Sie mich dies vorwegnehmen, es muss einen besseren Weg geben!
Zuerst erstellte ich mein eigenes Kontextobjekt, das an das vorhandene OperationContext-Objekt angefügt werden konnte.
public class TMRequestContext : IExtension<OperationContext> {
private OperationContext _Owner;
public void Attach(OperationContext owner) {
_Owner = owner;
}
public void Detach(OperationContext owner) {
_Owner = null;
}
public static TMRequestContext Current {
get {
if (OperationContext.Current != null) {
return OperationContext.Current.Extensions.Find<TMRequestContext>();
} else {
return null;
}
}
}
}
Um dieses neue Kontext-Objekt zugreifen zu können, müssen Sie es als eine Erweiterung des aktuellen hinzuzufügen. Ich habe das getan, indem ich eine Nachrichteninspektorklasse erstellt habe.
public class TMMessageInspector : IDispatchMessageInspector {
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) {
OperationContext.Current.Extensions.Add(new TMRequestContext());
return null;
}
}
Damit der Nachrichteninspektor funktioniert, müssen Sie ein neues "Verhalten" erstellen. Ich habe dies mit dem folgenden Code gemacht. einen neuen Host durch das Erstellen und Hinzufügen des Verhaltens Objekt manuell in der OnOpening Methode
public class TMServerBehavior : IServiceBehavior {
public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) {
//Do nothing
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) {
foreach (ChannelDispatcher chDisp in serviceHostBase.ChannelDispatchers) {
foreach (EndpointDispatcher epDisp in chDisp.Endpoints) {
epDisp.DispatchRuntime.MessageInspectors.Add(new TMMessageInspector());
}
}
}
}
Das Verhalten, das Sie sollten in der Config-Datei hinzufügen können, obwohl ich es tat. Ich benutzte diese Klasse für viel mehr als nur den Zugriff auf das OperationContext-Objekt. Ich benutzte sie zum Loggen und Überschreiben der Fehlerbehandlung und des Zugriffs auf das http - Anfrageobjekt usw. Also, es ist nicht ganz so lächerlich wie es scheint. Fast, aber nicht ganz!
Ich kann mich wirklich nicht erinnern, warum ich nicht direkt auf OperationContext.Current zugreifen konnte. Ich habe eine schwache Erinnerung daran, dass es immer leer war und dieser eklige Prozess die einzige Möglichkeit war, eine Instanz zu erhalten, die tatsächlich gültige Daten enthielt.
Hallo Darrel, Ich versuchte Ihren Vorschlag und stieß auf ein paar Probleme. Wenn ich Ihren genauen Code verwendet habe, habe ich diesen Fehler (zur Kompilierzeit): Kann 'System.ServiceModel.Web.WebOperationContext' nicht in 'System.ServiceModel.OperationContext' konvertieren Und wenn ich es in diesen Code geändert: Zeichenfolge body = OperationContext.Current.RequestContext.RequestMessage.ToString(); Der Körper war zur Laufzeit eine leere Zeichenfolge. Irgendwelche Ideen? Danke, Uri – urini