【问题标题】:'IApplicationBuilder' does not contain a definition for 'HttpContext'“IApplicationBuilder”不包含“HttpContext”的定义
【发布时间】:2019-09-22 04:02:49
【问题描述】:

我正在尝试使用此示例代码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 指令还是程序集引用?)

我看到contextMicrosoft.AspNetCore.Diagnostics.StatusCodeContext 类型,它有一个HttpContext property为什么不识别 HttpContext?

附:我尝试安装这些 NuGet 包无济于事:

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

【问题讨论】:

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


    【解决方案1】:

    您缺少一些 using 语句。有时 IntelliSense 并不能完全确定您想去的地方(陈述可能模棱两可)。你可以更具体,像这样编码:

    async (StatusCodeContext ctx) => ...
    

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

    async ctx => ...
    

    再次,它应该可以工作。

    【讨论】:

      【解决方案2】:

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

      我不确定为什么在我检查第一个 HttpContext 时没有发现该提示。

      【讨论】:

        【解决方案3】:

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

        你正在尝试使用这个重载:

        UseStatusCodePages(IApplicationBuilder, Func<StatusCodeContext,Task>)
        

        但由于您的 lambda 表达式不返回 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);
        });
        

        【讨论】:

        • 这最终不是问题所在。不过感谢您的关注!
        猜你喜欢
        • 2021-12-05
        • 2018-07-22
        • 2017-07-31
        • 1970-01-01
        • 2018-01-27
        • 2018-08-07
        • 1970-01-01
        • 1970-01-01
        • 2017-02-13
        相关资源
        最近更新 更多