Mis disculpas por la respuesta anterior, estúpidamente asumí que acababa de lanzar WebOperationContext para llegar al OperationContext, desafortunadamente la respuesta real es mucho más fea.
Déjame prefacio con esto, ¡debe haber una manera mejor!
Primero creé mi propio objeto de contexto, que podría adjuntarse al objeto OperationContext existente.
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;
}
}
}
}
Con el fin de poder acceder a este nuevo objeto de contexto, es necesario agregarlo como una extensión de la actual. Lo hice creando una clase de inspector de mensajes.
public class TMMessageInspector : IDispatchMessageInspector {
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) {
OperationContext.Current.Extensions.Add(new TMRequestContext());
return null;
}
}
Para que el inspector de mensajes funcione, debe crear un nuevo "comportamiento". Lo hice usando el siguiente código.
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());
}
}
}
}
El comportamiento debe ser capaz de añadir en el archivo de configuración, aunque lo hice mediante la creación de un nuevo huésped y añadiendo el objeto manualmente el comportamiento en el método OnOpening. Terminé usando estas clases para mucho más que simplemente acceder al objeto OperationContext. Los usé para registrar y anular el manejo de errores y el acceso al objeto de solicitud http, etc. Por lo tanto, no es una solución tan ridícula como parece. Casi, pero no del todo!
Realmente no recuerdo por qué no podía acceder directamente a OperationContext.Current. Tengo un leve recuerdo de que siempre estaba vacío y este desagradable proceso fue la única forma en que pude obtener una instancia que en realidad contenía datos válidos.
Hola Darrel, He intentado su sugerencia y encontré algunos problemas. Cuando utilicé su código exacto, obtuve este error (en tiempo de compilación): No se puede convertir el tipo 'System.ServiceModel.Web.WebOperationContext' en 'System.ServiceModel.OperationContext' Y cuando lo cambié a este código: string body = OperationContext.Current.RequestContext.RequestMessage.ToString(); El cuerpo era una cadena vacía en tiempo de ejecución. ¿Alguna idea? Gracias, Uri – urini