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ştirenBlazor {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.
ASP.NET Core
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin