【问题标题】:Getting HttpRequest context in self-hosted WebApi在自托管 WebApi 中获取 HttpRequest 上下文
【发布时间】:2014-01-07 20:16:43
【问题描述】:

如何从自托管的 MVC WebAPI 访问查询字符串?

使用 NRE 调用以下失败,因为 Current 为空(又名 null)

System.Web.HttpContext.Current.Request["myQuery"]

我需要访问控制器外部的当前上下文,因为我想通过控制我的对象实例化。 DI。例如。

        container
            .RegisterType<MyObject>(
                new InjectionFactory(
                    uc =>
                        new MyObject(
                            System.Web.HttpContext.Current.Request["myParam"]) //This failed.
                    ));

由于上述 NRE,从 ControllerApi 代码内部调用 container.Resolve&lt;MyObject&gt;() 失败。

【问题讨论】:

  • 你想做什么?为 HttpContext 使用 DI?
  • 反之,在DI中使用HttpContext
  • 在这种情况下您必须使用 HttpContextBase 而不是直接使用 HttpContext。
  • 怎么样?我需要一个关于当前线程正在运行的请求的线程静态引用。
  • 我发布了代码示例作为答案。我会在需要的地方改进它。我觉得它还没有找到你问题的根源,这就是你的 HttpContext 为空的原因。

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api


【解决方案1】:

您不应该在 Web API 中真正使用 System.Web.HttpContext.Current。它仅在使用 Web 主机时有效,并且实际上仅出于遗留原因。上下文信息隐藏在 HttpRequestMessage.Properties 集合中。

Web API 提高可测试性的方法之一是消除其对静态属性的依赖。

有一些方法可以处理实例解析和传递参数。看到这个问题Unity Application Block, How pass a parameter to Injection Factory?

【讨论】:

    【解决方案2】:

    HttpContext.Current 在自托管项目中不可用

    见:HttpSelfHostServer and HttpContext.Current

    【讨论】:

    • Frazell,谢谢,但是谁会去 SetContext?我希望这是自动完成的,我不想自己通过过滤器/ webapi 扩展来连接它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2018-05-04
    相关资源
    最近更新 更多