«IApplicationBuilder» не содержит определения для «HttpContext» - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь настроить обработку определенных кодов статуса ответа HTTP в промежуточном программном обеспечении моего приложения ASP.NET Core 2.2 MVC, используя этот пример кода из документации Microsoft :

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' (вы пропустили директива использования или ссылка на сборку?)

Я вижу, что context имеет тип Microsoft.AspNetCore.Diagnostics.StatusCodeContext , который имеет свойство HttpContext . Почему он не распознает 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

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Обнаружена проблема ... это немного странно: когда я проверяю Intellisense в первом экземпляре HttpContext, он не предлагает никаких предложений для операторов using, но когда я делаю это в любом другом экземпляре он предлагает добавить ссылку на Microsoft.AspNetCore.Http, которая исправляет это.

Я не уверен, почему при проверке первого HttpContext.

он не находит такого предложения.
0 голосов
/ 03 мая 2019

Вам нужно вернуть Task из вашего лямбда-выражения, чтобы компилятор распознал правильную перегрузку.

Вы пытаетесь использовать эту перегрузку:

UseStatusCodePages(IApplicationBuilder, Func<StatusCodeContext,Task>)

Но так как ваше лямбда-выражение не возвращает 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);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...