【问题标题】:HttpContext in WCFWCF 中的 HttpContext
【发布时间】:2011-02-04 16:49:35
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: wcf rest httpcontext


    【解决方案1】:

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

    谢谢 巴勃罗。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多