'IApplicationBuilder' 不包含 'HttpContext' 的定义

'IApplicationBuilder' does not contain a definition for 'HttpContext'

我正在尝试使用此示例代码 from Microsoft docs:

在我的 ASP.NET Core 2.2 MVC 应用程序的中间件中配置某些 HTTP 响应状态代码的处理
app.UseStatusCodePages(async context =>
{
    context.HttpContext.Response.ContentType = "text/plain";

    await context.HttpContext.Response.WriteAsync(
        "Status code page, status code: " + 
        context.HttpContext.Response.StatusCode);
});

但是它显示 HttpContext

的错误

'IApplicationBuilder' does not contain a definition for 'HttpContext' and no accessible extension method 'HttpContext' accepting a first argument of type 'IApplicationBuilder' could be found (are you missing a using directive or an assembly reference?)

我看到 contextMicrosoft.AspNetCore.Diagnostics.StatusCodeContext which has a HttpContext property 类型。 为什么不识别 HttpContext?

P.S。我尝试安装这些 NuGet 包无济于事:

Microsoft.AspNetCore.Diagnostics
Microsoft.AspNetCore.Diagnostics.Abstractions
Microsoft.AspNetCore.Http
Microsoft.AspNetCore.Http.Abstractions
Microsoft.AspNetCore.Http.Extensions
Microsoft.AspNetCore.Http.Features

您需要从 lambda 表达式中 return Task 编译器才能识别正确的重载。

您正在尝试使用此重载:

UseStatusCodePages(IApplicationBuilder, Func<StatusCodeContext,Task>)

但是由于您的 lambda 表达式没有 return Task,编译器正在使用此重载:

UseStatusCodePages(IApplicationBuilder, Action<IApplicationBuilder>)

因此,您的 context 变量实际上是指 IApplicationBuilder 的实例,而不是 StatusCodeContext

WriteAsync 返回 Task 应该可以解决问题:

app.UseStatusCodePages(context =>
{
    context.HttpContext.Response.ContentType = "text/plain";

    return context.HttpContext.Response.WriteAsync(
        "Status code page, status code: " + 
        context.HttpContext.Response.StatusCode);
});

发现问题...有点奇怪:当我在 HttpContext 的第一个实例上检查 Intellisense 时,它​​没有为 using 语句提供任何建议,但是当我这样做时在任何其他情况下,它建议添加对 Microsoft.AspNetCore.Http 的引用,从而修复它。

我不确定为什么当我检查第一个 HttpContext 时没有发现该建议。

您缺少一些 using 语句。有时 IntelliSense 并不能完全了解您想去的地方(声明可能含糊不清)。您可以更具体并像这样编码:

async (StatusCodeContext ctx) => ...

在你的情况下,IntelliSense 很可能会建议一些你需要的 using 语句,之后你可以替换为:

async ctx => ...

再次,它应该可以工作。