2011-02-04 16 views
7

He escrito una API REST simple en WCF, y el mecanismo de autenticación utiliza una clave API. Una vez que el cliente envía la clave de API en el encabezado de la solicitud, puedo comprobar que en el lado del servidor (en la clase BaseService reemplazando el método ProcessRequest() de la clase RequestInterceptor) de la siguiente manera:HttpContext en WCF

public partial class BaseService : RequestInterceptor 
{ 
    public BaseService() : base(false) { } 

    #region Process Request 
    public override void ProcessRequest(ref RequestContext requestContext) 
    { 
     if (IsValidApiKey(requestContext)) 
      //put some values in HttpContext object. 

    } 

...

Ahora he habilitado la compatibilidad aspnet en mis servicios REST, pero todavía no puedo acceder al objeto HttpContext en la anulación de ProcessRequest anterior. Tenga en cuenta que se puede acceder a HttpContext desde dentro de un método de servicio, pero no en el método ProcessRequest.

¿Alguna idea de por qué?

Respuesta

1

he resuelto mi problema mediante la adición siguiente código:

private HttpContext _httpContext; 
public BaseService() 
     : base(true) 
    { 
     _httpContext = HttpContext.Current;    

    } 

Después de hacer esto soy capaz de acceder HttpContext objeto en el método ProcessRequest.

1

El HttpContext probablemente se inicializó mucho más tarde en la pila de canales de WCF. Recuerde que un interceptor de canal se ejecuta en la pila de canales antes que nada, y justo después de que el mensaje se haya recibido del oyente del canal Http. ¿Qué necesitas para tener acceso al HttpContext desde un interceptor de solicitud? La solicitud HTTP está disponible como una propiedad en el mensaje asociado al requestContext. También puede agregar almacenar algunos valores en las bolsas de propiedades disponibles en el mensaje también.

Gracias Pablo.

1

Sin embargo, debe tener en cuenta que HttpContext.Current no es seguro para subprocesos y que lo que se configura con un subproceso podría modificarse por otro.

Por ejemplo, dos solicitudes vienen a su servicio. Pones un valor al HttpContext en RequestInterceptor para la primera solicitud. La segunda solicitud espera hasta que la primera solicitud no finalice con RequestInterceptors. Si la primera solicitud finaliza con RequestInterceptors y se le pasa a su servicio, la segunda solicitud ingresa RequestInterceptors y puede acceder al HttpContext configurado por la primera solicitud si la primera solicitud no finaliza. Es un tipo de problemas que he encontrado.

Cuestiones relacionadas