34

Tengo algunos servicios RESTful ejecutándose en un contexto WCF puro (es decir, la compatibilidad ASP.NET no está habilitada, y por lo tanto no hay ningún objeto HttpContext.Current disponible).¿Cuál es el equivalente de WCF de HttpContext.Current.Request.RawUrl?

Las direcciones URL de los servicios se vuelven a escribir en el inicio de la solicitud utilizando un IHttpModule (que en ese momento tiene un HttpContext y reescribe usando HttpContext.Current.RewritePath) para deshacerse de cosas como la .svc extensión de la URL.

Sin embargo, necesito acceder a la URL original que se solicitó dentro de la infraestructura de WCF. ¿Existe un equivalente a HttpContext.Current.Request.RawUrl en las clases OperationContext o WebOperationContext en cualquier lugar? El uso de WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri devuelve la URL reescrita, no la original.

Respuesta

40

Usted puede obtener el punto final al momento son objeto y el Uri para ello haciendo:

OperationContext.Current.RequestContext.RequestMessage.Headers.To 

que creo que es lo mismo que:

OperationContext.Current.IncomingMessageHeaders.To 

Este es un objeto System.Uri, y yo cree que puede obtener el OriginalString o PathAndQuery, o las piezas que desee de él.

2

intentar algo como esto:

OperationContext.Current.Channel.LocalAddress.Uri.AbsoluteUri 
+0

Buena respuesta de acuerdo con el título de la pregunta (diciendo con la perspectiva de búsqueda de google) – Sami

+0

probé System.ServiceModel.Web.WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri, OperationContext.Current.RequestContext.RequestMessage.Headers.To, y OperationContext.Current.IncomingMessageHeaders.To, el único que funciona es OperationContext.Current.Channel.LocalAddress.Uri – rob

1

He encontrado que el uso de

OperationContext.Current.RequestContext.RequestMessage.Headers.To 

funciona más de las veces, pero no lo hicieron para mi aplicación. Está detrás de un NLB (Network Load Balancer), lo que hace que pierda el nombre de host de entrada original. Pero el host de entrada todavía está en un encabezado llamado "Host", que fue sorprendentemente difícil de conseguir. Se encuentra en:

System.ServiceModel.Web.WebOperationContext.Current.IncomingRequest.Headers["Host"] 

(los objetos de encabezado en System.ServiceModel.OperationContext.Current.IncomingMessageHeaders realmente no tienen todas las cabeceras del cliente)

+0

Buen punto. También tenga en cuenta este problema con 'UserHostAddress': http://stackoverflow.com/q/650357/266535 – styfle

Cuestiones relacionadas