繁体   English   中英

如何在同一进程中实现 ASP.NET 核心 Blazor 服务器应用程序和 Web API 应用程序?

[英]Howto implement ASP.NET Core Blazor Server app and a Web API app in the same procress?

我想同时实施

  • 一个 ASP.NET 核心 Blazor 服务器
  • 和一个 ASP.NET 核心 Web API(服务器部分,不是消费者/客户端)

同一进程中使用 .NET 6 并使用 Kestrel 自托管运行它,即没有 IIS。

我认为关键是在相应的 Program.cs 模板中找到的服务和中间件管道配置。 这是 VS 2022 (17.1.5) 为我创建的两个模板:

对于 Blazor 服务器应用程序:

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();

对于 ASP.NET Core Web API App:

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();

所以问题是如何将这两者合而为一?

我想要:

  • 让我的程序监听一个端口
  • 主机 Blazor web 页
  • 但是在访问 URL myhost:port/api/..时处理 API(不干扰 Blazor 部分)
  • 拥有 SwaggerUI,最好在myhost:port/api/swagger/index.html 下(再次不干扰 Blazor 部分)
  • 对两者使用基于客户端证书的相同安全机制

您应该能够毫无问题地组合这些:

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.UseSwagger();
    app.UseSwaggerUI();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();

app.UseRouting();
app.MapControllers();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

app.Run();

无论如何,服务配置支持注册所有依赖项。 AddRazorPages()AddController()之间,无论如何都有很多共享的。

唯一棘手的是管道配置,因为您需要确保 API 请求和 Blazor 请求都由正确的处理程序处理。

好消息是MapControllers通常意味着一组固定的路由。 由于您的 controller 操作具有特定路线,因此首先使用MapControllers将确保这些特定路线将由您的控制器正确处理。

所有其他请求,那些不匹配任何 controller 操作的请求,然后将 go 发送到管道中的下一个路由处理程序。 因此MapBlazorHub是下一个,它将托管 Blazor 的 SignalR 集线器。这也是此处提供的非常具体的路由。

所以最后,所有剩余的请求都将到达MapFallbackToPage() 这是一个后备处理程序,这意味着它将处理任何路由。 这允许 Blazor 有一个入口点,然后它将使用客户端路由。 只要这个回退调用是管道中的最后一个,它就不能干扰任何其他路由处理程序。

使用该组合配置,您的 API 和 Blazor 都应该可以正常工作。

如果您确实遇到了更复杂的情况,那么您可以使用app.MapWhen来分支管道。 如果您对此功能感兴趣, 文档中有一个示例 但正如我所说,对于你的情况,你不应该需要它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM