Aracılığıyla paylaş


Artımlı geçişte Yarp ile ASP.NET Core Blazor Server desteğini etkinleştirme

Bir uygulamaya Yarp Blazor Server eklerken, her ikisi de uygulamanın istek yönlendirmesi için geri dönüş yolları olarak hareket etmeye çalışır. ya da Blazor Yarp yönlendirmeyi rastgele işler, bu da derin bağlama Blazor gibi senaryoların başarısız olabileceği anlamına gelir. Bu, bu yılın sonraki sürümlerinde .NET 8 sürümünde düzeltilecektir. ASP.NET Core 6.0 ve 7.0'a geçiş için, bu makaledeki yönergeleri izleyerek doğru istek yönlendirmesine ulaşmak için 'nin uç noktalarını eşleyin Blazor.

Aşağıdaki yol oluşturucu uzantıları sınıfını projeye ekleyin.

BlazorEndpointRouteBuilderExtensions.cs:

using System;
using System.Collections.Generic;
using System.Reflection;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Routing;

public static class BlazorEndpointRouteBuilderExtensions {
    public static IEndpointConventionBuilder MapBlazorPages(
        this IEndpointRouteBuilder endpoints, string page)
    {
        var assembly = Assembly.GetEntryAssembly();

        if (assembly is null)
        {
            throw new InvalidOperationException("No entry assembly available.");
        }

        return endpoints.MapBlazorPages(page, assembly);
    }

    public static IEndpointConventionBuilder MapBlazorPages(
        this IEndpointRouteBuilder endpoints, string page, 
        params Assembly[] assemblies)
    {
        ArgumentNullException.ThrowIfNull(assemblies);

        var builder = new BlazorEndpointConventionBuilder();

        foreach (var route in GetRoutes(assemblies))
        {
            var conventionBuilder = endpoints.MapFallbackToPage(route, page);

            conventionBuilder.Add(b =>
            {
                b.DisplayName = $"Blazor {route}";
                ((RouteEndpointBuilder)b).Order = -1;
            });

            builder.Add(conventionBuilder);
        }

        return builder;
    }

    private static IEnumerable<string> GetRoutes(Assembly[] assemblies)
    {
        foreach (var assembly in assemblies)
        {
            foreach (var type in assembly.GetTypes())
            {
                if (typeof(IComponent).IsAssignableFrom(type))
                {
                    foreach (var attribute in 
                        type.GetCustomAttributes(typeof(RouteAttribute)))
                    {
                        if (attribute is RouteAttribute { Template: { } route })
                        {
                            yield return route;
                        }
                    }
                }
            }
        }
    }

    private sealed class BlazorEndpointConventionBuilder : IEndpointConventionBuilder {
        private readonly List<IEndpointConventionBuilder> builders = new();

        public void Add(IEndpointConventionBuilder builder)
        {
            builders.Add(builder);
        }

        void IEndpointConventionBuilder.Add(Action<EndpointBuilder> convention)
        {
            foreach (var builder in builders)
            {
                builder.Add(convention);
            }
        }

#if NET7_0_OR_GREATER
        void IEndpointConventionBuilder.Finally(
            Action<EndpointBuilder> finalConvention)
        {
            foreach (var builder in builders)
            {
                builder.Finally(finalConvention);
            }
        }
#endif
    }
}

Önceki kodda:

  • EndpointBuilder.DisplayName varsayılan olarak Fallback {route} şeklinde ayarlanır. Bunu (b.DisplayName = $"Blazor {route}";) olarak değiştiren Blazor {route} satır, yolu açıkça kaydedilmiş olarak tanımlarBlazor.
  • Rota sırasını ()((RouteEndpointBuilder)b).Order = -1;{page} ayarlayan satır için varsayılan olarak rota sırası vardır0. Rota sırasını-1, Blazor rota önceliği verecek şekilde değiştirildiğinden Blazor emin olmak için ayarlamak.

uygulamasında kullanmak Blazor için uygulama kaydını güncelleştirin Program.cs:

- app.MapFallbackToPage("/_Host");
+ app.MapBlazorPages("/_Host");

Bu noktada uygulama, ve Yarp için Blazor istekleri doğru yönlendirmeli ve sayfalara ayrıntılı bağlantı vermelidir.