如何在同一进程中实现 ASP.NET Core Blazor Server 应用和 Web API 应用?

卡罗克斯

我想同时实现

  • 一个 ASP.NET Core Blazor 服务器
  • 和一个 ASP.NET Core 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 应用程序:

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 网页
  • 但是在访问 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.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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在ASP .NET Core Web API中映射后备,以便Blazor WASM应用程序仅拦截不对API的请求

ASP .Net Core Web 应用程序调用 Web API

如何在 ASP.NET Core Web 应用程序中添加 API

如何允许从本地主机和容器到ASP.NET Core Web API应用程序的HTTPS连接?

Asp.net Core中的Web应用程序与Web Api项目类型

Web 应用程序和 API AzureAD 身份验证流程 ASP.NET Core

如何通过IdentityServer4将OpenIdConnect添加到ASP.NET Core ServerSide Blazor Web应用程序?

在Azure上部署的.Net Core 3.1 Web应用程序显示错误HTTP错误500.35-同一进程中的ANCM多个进程内应用程序

Azure 静态 Web 应用程序 Blazor WASM .Net Core API 和标识 - 无法从“_configuration”加载设置

ASP.NET Core Web API与ASP.NET Core应用程序

从Blazor客户端应用程序从ASP.NET Core API下载文件

Asp.Net Core Web API应用程序:如何更改监听地址?

HTTP错误500.35-同一进程ASP.NET Core 3中的ANCM多个进程内应用程序

可以在Windows服务定位中托管ASP.NET Core 2 Web API NET Core 2应用程序

如何将XML从ASP.NET 4 Web API返回到ASP.NET Core 2应用程序?

使用.NET Core Web API作为ASP.NET Web窗体应用程序的子路由

如何让 ReactJs 和 AngularJs 在 ASP.Net Core Web 应用程序中共存?

ASP.NET Core中控制台应用程序和Web应用程序之间的区别

.NET Core Blazor Web应用程序会像ASP.NET WebForms一样进入睡眠状态吗?

如何从VS Code发布.Net Core Web Api和Angular 6应用到Azure?

部署asp net core web应用程序后找不到Web API 404

由于 ASP .net core blazor 应用程序的 SSRS 中的 CORS,访问被拒绝

在 ASP.NET Core 托管的 Blazor 应用程序中对服务器进行匿名调用

Asp.net Web应用程序和Asp.net Web API2之间的共享会话(Asp.net Web API2托管在访问一种配置的Asp.net Web应用程序下)

如何管理 android 应用程序和 ASP.net Web API 之间的状态?

在ASP.NET Web / API应用程序中同时使用Cookie和JWT令牌

asp.net Web API应用程序中的Route和RoutePrefix问题

如何在Visual Studio中使用ASP.NET Core Web应用程序-API项目托管网页?

如何在 ASP.NET Core 6 中将应用程序项目的服务集合扩展到 Web api?