“ IApplicationBuilder”不包含“ HttpContext”的定义

时间:2019-05-03 15:12:30

标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.2

我正在尝试使用以下示例代码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”不包含“ HttpContext”的定义   并且没有可访问的扩展方法'HttpContext'接受第一个   可以找到类型为“ IApplicationBuilder”的参数(您是否丢失了   using指令还是程序集引用?)

我看到context的类型为Microsoft.AspNetCore.Diagnostics.StatusCodeContext,具有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

3 个答案:

答案 0 :(得分:0)

您需要从lambda表达式返回Task,以便编译器识别正确的重载。

您正在尝试使用此重载:

UseStatusCodePages(IApplicationBuilder, Func<StatusCodeContext,Task>)

但是由于您的lambda表达式未返回Task,所以编译器正在使用此重载:

UseStatusCodePages(IApplicationBuilder, Action<IApplicationBuilder>)

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

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

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

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

答案 1 :(得分:0)

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

我不确定为什么在我检查第一个HttpContext时没有找到建议。

答案 2 :(得分:0)

您缺少一些using语句。有时IntelliSense并没有完全掌握您要去的地方(语句可能不明确)。您可以更具体地进行编码,如下所示:

async (StatusCodeContext ctx) => ...

在您的情况下,最有可能让IntelliSense建议您需要的一些using语句,然后您可以将其替换为:

async ctx => ...

再次,它应该可以工作。