WCF中的HttpContext

时间:2011-02-04 16:49:35

标签: wcf rest httpcontext

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

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

任何想法为什么?

3 个答案:

答案 0 :(得分:1)

HttpContext可能稍后在WCF通道堆栈中初始化。请记住,通道拦截器先在通道堆栈中运行,然后在从Http通道侦听器接收到消息之后运行。从请求拦截器访问HttpContext需要什么? Http请求在与requestContext关联的消息中作为属性提供。您还可以在消息中可用的属性包中添加商店一些值。

由于 巴勃罗。

答案 1 :(得分:1)

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

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

    }

执行此操作后,我可以在ProcessRequest方法中访问HttpContext对象。

答案 2 :(得分:1)

但是你应该注意到HttpContext.Current不是线程安全的,用一个线程设置的东西可以被另一个线程修改。

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