我想同时实现
在同一进程中使用 .NET 6 并使用 Kestrel 自托管运行它,即不使用 IIS。
我假设关键是在相应的 Program.cs 模板中找到的服务和中间件管道配置。以下是 VS 2022 (17.1.5) 为我创建的两个模板:
using BlazorApp1.Data;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
app.Run();
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
所以问题是如何将这两者合二为一?
我想要:
您应该能够毫无问题地组合这些:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>();
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.UseRouting();
app.MapControllers();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
app.Run();
服务配置无论如何都支持注册所有依赖项。AddRazorPages()
在和之间AddController()
,无论如何都有很多共享的。
唯一可能比较棘手的是管道配置,因为您需要确保 API 请求和 Blazor 请求都由正确的处理程序处理。
好消息是这MapControllers
通常意味着一组固定的路线。由于您的控制器操作具有特定的路由,因此拥有第MapControllers
一个将确保您的控制器正确处理这些特定的路由。
所有其他请求,那些不匹配任何控制器操作的请求,将转到管道中的下一个路由处理程序。MapBlazorHub
下一个将为 Blazor 托管 SignalR 集线器也是如此。这也是此处提供的非常具体的路线。
所以最后,所有剩余的请求都将落在MapFallbackToPage()
. 这是一个后备处理程序,这意味着它将处理任何路由。这允许 Blazor 拥有一个入口点,然后它将使用客户端路由。只要这个后备调用是管道中的最后一个,它就不能干扰任何其他路由处理程序。
使用这种组合配置,您的 API 和 Blazor 都应该可以正常工作。
如果您确实有更复杂的情况,那么您可以使用app.MapWhen来分支管道。如果您对此功能感兴趣,文档中有一个示例。但正如我所说,对于你的情况,你不应该需要它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句