Как приложения Blazor могут предоставлять конечные точки Razor Pages без вызова MapRazorPages () в Startup.cs? - PullRequest
1 голос
/ 19 января 2020

В шаблоне проекта Razor Pages по умолчанию частью кода в Startup.cs, который включает Razor Pages, является вызов MapRazorPages () в разделе конфигурации конечной точки Configure ():

app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });

Необходимость этого вызова подтверждается в превосходной статье Введение в Razor Pages в статье ASP. NET Core Рика Андерсона и Райана Новака.

Хотя Blazor - это другая технология пользовательского интерфейса, Проекты Blazor также могут предоставлять конечные точки Razor Pages. Например, проект Blazor, включающий ASP. NET Аутентификация с использованием удостоверений, отображает страницы входа и выхода из системы в виде страниц Razor.

Однако инициализация конечной точки в проекте Blazor, который предоставляет страницы Razor, не отображается задействовать вызов MapRazorPages (). Если вы создаете новый проект с использованием шаблона Blazor по умолчанию с индивидуальной аутентификацией учетной записи пользователя, то скаффолд на всех страницах Razor, используемых ASP. NET Identity, инициализация конечной точки завершается следующим образом:

app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });

Полученное приложение может правильно направлять запросы к конечным точкам Razor Pages, таким как Login.cs html и LogOut.cs html. Как это возможно без вызова MapRazorPages ()?

1 Ответ

2 голосов
/ 19 января 2020

Сначала взгляните на следующие фрагменты кода (обратите внимание на выделенные строки в обоих)

Ссылка MapRazorPages

/// <summary>
/// Adds endpoints for Razor Pages to the <see cref="IEndpointRouteBuilder"/>.
/// </summary>
/// <param name="endpoints">The <see cref="IEndpointRouteBuilder"/>.</param>
/// <returns>An <see cref="PageActionEndpointConventionBuilder"/> for endpoints associated with Razor Pages.</returns>
public static PageActionEndpointConventionBuilder MapRazorPages(this IEndpointRouteBuilder endpoints)
{
    if (endpoints == null)
    {
        throw new ArgumentNullException(nameof(endpoints));
    }

    EnsureRazorPagesServices(endpoints); //<-- NOTE THIS

    return GetOrCreateDataSource(endpoints).DefaultBuilder;
}

Ссылка MapFallbackToPage

public static IEndpointConventionBuilder MapFallbackToPage(this IEndpointRouteBuilder endpoints, string page)
{
    if (endpoints == null)
    {
        throw new ArgumentNullException(nameof(endpoints));
    }

    if (page == null)
    {
        throw new ArgumentNullException(nameof(page));
    }

    PageConventionCollection.EnsureValidPageName(page, nameof(page));

    EnsureRazorPagesServices(endpoints); //<-- NOTE THIS

    // Called for side-effect to make sure that the data source is registered.
    GetOrCreateDataSource(endpoints).CreateInertEndpoints = true;

    // Maps a fallback endpoint with an empty delegate. This is OK because
    // we don't expect the delegate to run.
    var builder = endpoints.MapFallback(context => Task.CompletedTask);
    builder.Add(b =>
    {
        // MVC registers a policy that looks for this metadata.
        b.Metadata.Add(CreateDynamicPageMetadata(page, area: null));
    });
    return builder;
}

Они оба обращаются к основной функции, которая настраивает функции для обработки запросов страницы бритвы.

...