【问题标题】:Difference between HttpControllerContext.Request and HttpContext.Current.RequestHttpControllerContext.Request 和 HttpContext.Current.Request 之间的区别
【发布时间】:2026-02-10 19:35:01
【问题描述】:

我只是想对我的自定义 ApiController 进行单元测试。在我的自定义控制器中,我重写了 Initialize 方法来评估授权标头。

所以我的问题是,我有 2 个请求标头可用。

protected override void Initialize(HttpControllerContext controllerContext)
{
    base.Initialize(controllerContext);
    // Headers 1
    var headersOne = controllerContext.Request.Headers;
    // Headers 2
    var headersTwo = HttpContext.Current.Request.Headers;
}

但这不是问题本身。问题是,标题不匹配。因此,对于生产性操作:我必须在哪里寻找授权标头。我必须在哪里为我的测试场景应用我的授权标头。

目前我将授权标头应用于controllerContext

var fakeControllerContext = new HttpControllerContext
{
    Request = new HttpRequestMessage
    {
        RequestUri = new Uri("http://localhost/api/test"),
        Headers =
        {
            { "Authorization", "Fake Authorization-Header"}
        }
    }
};

但正如我已经说过的。该标头稍后在 HttpContext.Current.Request.Headers 中不可用。 你能帮帮我吗?不幸的是,我不完全了解哪个上下文可以实现什么目的。

【问题讨论】:

标签: c# unit-testing httpcontext request-headers asp.net-apicontroller


【解决方案1】:

我现在发现HttpContext.Current 是一个不应该再使用的旧实现。因为您无法控制它的内容来对其进行单元测试。

HttpControllerContext 只是较新的实现。它的内容也是可以交换的。提交给方法初始化的 controllerContext 在ControllerContext-Property 中可用。所以你应该使用它。

在第一个答案中找到了这个: Testing a Web API method that uses HttpContext.Current.Request.Files? 感谢:Martin Liversage

【讨论】: