在 Blazor 服务器应用程序中托管 Web api
Host web api in blazor server application
我已经在我的解决方案中添加了一个 webapi 项目,它带有一个控制器来执行 HttpGet。 Blazor 服务器项目可以在本地和部署时很好地访问它。我可以在本地向该服务发出邮递员调用,但已部署的版本从我的 _Host 文件中向我提供 Blazor 连接失败消息。我如何配置 webapi 外部访问而不干扰 Blazor?
我认为这可能是我需要解决的某种路由问题。我正在使用 .NET5 并且我的 webapi 启动有这个:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "myapp.WebApi v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
WebApi Program.cs:
namespace myapp.WebApi
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Blazor Program.cs:
namespace myapp.UI
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
我的 blazor 项目启动:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UsePathBase("/myapp");
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
//TelemetryDebugWriter.IsTracingDisabled = true;
}
else
{
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();
}
// SD2: app.UseSession();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
// SD2: app.UseMvc();
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
// prior fallback setting
// endpoints.MapFallbackToPage("/_Host");
// 1/4/22
endpoints.MapFallbackToPage("{*path:regex(^(?!api).*$)}", "/_Host"); // don't match paths beginning with api
});
}
我正在研究将 .../api/... 调用路由到 webapi 项目以及将其他所有内容路由到 blazor 项目的方法。
在 VS 中,我的调用是
https://localhost:44368/api/controller/GetFoos/Year=2020
我部署的调用(尝试了几种变体)
https://serverName/appName/api/controller/GetFoos/Year=2020
在 Blazor 中失败。我希望 Blazor 忽略并让 WebApi 处理它。
这只是一些代码,用于展示如何在同一站点上 运行 API 控制器和 Blazor。
您通常会像这样将控制器添加到 Blazor Server 项目:
添加服务
services.AddControllers();
或者如果控制器在另一个 project/assembly
services.AddControllers().PartManager.ApplicationParts.Add(new AssemblyPart(typeof(Blazr.Database.Controllers.WeatherForecastController).Assembly));
然后像这样设置中间件管道:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapRazorPages();
endpoints.MapFallbackToPage("/_Host");
});
_Host.cshtml
是 Blazor Server SPA 启动文件。
endpoints.MapControllers();
拦截并完成对控制器的所有请求。 Blazor App 启动页面是最后的回退。
您也可以试试这个(从简短的测试来看它似乎有效)。尝试在 app.Map
.
内映射回退
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<LocationsServiceV1>().EnableGrpcWeb();
endpoints.MapControllers();
endpoints.MapRazorPages();
});
app.Map("",
builder =>
{
builder.UseRouting();
builder.UseEndpoints(endpoints =>
{
// Fallback for blazor front-end
endpoints.MapFallbackToAreaPage("{*path:nonfile}", "/_Host", "Frontend");
});
});
我已经在我的解决方案中添加了一个 webapi 项目,它带有一个控制器来执行 HttpGet。 Blazor 服务器项目可以在本地和部署时很好地访问它。我可以在本地向该服务发出邮递员调用,但已部署的版本从我的 _Host 文件中向我提供 Blazor 连接失败消息。我如何配置 webapi 外部访问而不干扰 Blazor?
我认为这可能是我需要解决的某种路由问题。我正在使用 .NET5 并且我的 webapi 启动有这个:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "myapp.WebApi v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
WebApi Program.cs:
namespace myapp.WebApi
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Blazor Program.cs:
namespace myapp.UI
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
我的 blazor 项目启动:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UsePathBase("/myapp");
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
//TelemetryDebugWriter.IsTracingDisabled = true;
}
else
{
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();
}
// SD2: app.UseSession();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
// SD2: app.UseMvc();
app.UseEndpoints(endpoints =>
{
endpoints.MapBlazorHub();
// prior fallback setting
// endpoints.MapFallbackToPage("/_Host");
// 1/4/22
endpoints.MapFallbackToPage("{*path:regex(^(?!api).*$)}", "/_Host"); // don't match paths beginning with api
});
}
我正在研究将 .../api/... 调用路由到 webapi 项目以及将其他所有内容路由到 blazor 项目的方法。
在 VS 中,我的调用是 https://localhost:44368/api/controller/GetFoos/Year=2020
我部署的调用(尝试了几种变体) https://serverName/appName/api/controller/GetFoos/Year=2020
在 Blazor 中失败。我希望 Blazor 忽略并让 WebApi 处理它。
这只是一些代码,用于展示如何在同一站点上 运行 API 控制器和 Blazor。
您通常会像这样将控制器添加到 Blazor Server 项目:
添加服务
services.AddControllers();
或者如果控制器在另一个 project/assembly
services.AddControllers().PartManager.ApplicationParts.Add(new AssemblyPart(typeof(Blazr.Database.Controllers.WeatherForecastController).Assembly));
然后像这样设置中间件管道:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapRazorPages();
endpoints.MapFallbackToPage("/_Host");
});
_Host.cshtml
是 Blazor Server SPA 启动文件。
endpoints.MapControllers();
拦截并完成对控制器的所有请求。 Blazor App 启动页面是最后的回退。
您也可以试试这个(从简短的测试来看它似乎有效)。尝试在 app.Map
.
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<LocationsServiceV1>().EnableGrpcWeb();
endpoints.MapControllers();
endpoints.MapRazorPages();
});
app.Map("",
builder =>
{
builder.UseRouting();
builder.UseEndpoints(endpoints =>
{
// Fallback for blazor front-end
endpoints.MapFallbackToAreaPage("{*path:nonfile}", "/_Host", "Frontend");
});
});