WCF中的HttpContext

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

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方法中访问。

任何想法为什么?


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

谢谢巴勃罗。


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

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

    }

这样做后,我可以访问ProcessRequest方法中的HttpContext对象。


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

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

链接地址: http://www.djcxy.com/p/4567.html

上一篇: HttpContext in WCF

下一篇: How to bitblit from RenderTargetBitmap to WriteableBitmap?