2011-02-04 36 views
7

我已经在WCF中编写了一个简单的REST API,并且认证机制使用了一个API密钥。一旦客户端在请求报头提交API密钥,我检查它在服务器侧(在BaseService类中重写RequestInterceptor类的的ProcessRequest()方法),如下所示:WCF中的HttpContext

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. 

    } 

...

现在我已经在我的REST服务中启用了aspnet兼容性,但是我仍然无法访问上面的ProcessRequest覆盖中的HttpContext对象。 请注意HttpContext可以从服务方法中访问,但不能在ProcessRequest方法中访问。

任何想法为什么?

回答

1

我已经通过添加以下代码解决我的问题:

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

    } 

这样做后,我能够访问HttpContext对象的ProcessRequest方法。

1

HttpContext可能在WCF频道堆栈中稍后初始化。请记住,通道拦截器在通道堆栈中运行之前,以及刚收到来自Http通道侦听器的消息之后。你需要从请求拦截器访问HttpContext? Http请求作为与requestContext关联的消息中的属性提供。您还可以在消息中的可用属性包中添加一些存储值。

谢谢 Pablo。

1

但是,您应该注意到HttpContext.Current不是线程安全的,并且使用一个线程设置的内容可能会被另一个线程修改。

例如两个请求来到您的服务。您为第一个请求在RequestInterceptor的HttpContext中添加了一些值。第二个请求等待,直到第一个请求未完成RequestInterceptors。如果第一个请求使用RequestInterceptors完成并传递给您的服务,则第二个请求将进入RequestInterceptors,如果第一个请求未完成,则可以访问由第一个请求设置的HttpContext。这是我遇到的一种问题。