在Blazor WebAssembly解决方案中,如何在服务器API的不同端口上托管Blazor WASM客户端应用程序



我有一个Blazor WebAssembly解决方案,它包含客户端项目、服务器项目和共享项目,基于Microsoft的默认解决方案模板。我正在使用谷歌Chrome在Visual Studio 2019预览版中进行编辑和调试。

开箱即用,该解决方案只有一个启动项目,即服务器应用程序。该服务器应用程序具有对客户端应用程序的项目引用。您可以通过在服务器项目属性中选中"启用SSL"来将其设置为使用HTTPS,我已经做到了。

当你点击debug时,它可以完美地工作。

现在我想更改它,这样我所有的Blazor WASM页面都可以从https://localhost:44331并且服务器应用程序的API控制器端点从https://localhost:44331/api

我想使用URL的这个额外的"/api"部分来保持对api的请求与浏览Blazor客户端应用程序是分开的。因此,如果我请求"https://localhost:44331/api/something"我知道我会在我的网络API中达到一个点,但如果我请求"https://localhost:44331/something"我知道我会在Blazor客户端应用程序中点击一个特定的页面。我认为它也将更接近于生产中的正常设置。

我希望清楚我想做什么。

显而易见的起点似乎是将服务器应用程序属性的"调试"部分中的"应用程序URL"设置更改为"http://localhost:52708/api"。项目分配了一个安全URL"https://localhost:44331/api.我在客户端应用程序中保留了相同的设置,因此在客户端应用中,客户端应用程序的"属性"的"调试"部分中的"应用URL"设置仍然是http://localhost:52708,项目分配了一个安全URLhttps://localhost:44331".

这打破了一切。

现在"https://localhost:44331/"导致404未找到错误,"https://localhost:44331/api"把我带到一个页面,上面写着:

正在加载
发生了未经处理的错误。重新加载🗙

那太容易了!有人知道按照我想要的方式获得环境的正确方法吗?

好!我终于找到了一种可行的方法。这并不复杂,但我花了的时间才找到答案,所以我将把它发布在这里,因为我认为它对其他人有用。

在控制器上:

[Route("api/[controller]")]
public class SampleController : ControllerBase
{
//Etc.
}

在Startup.cs…中

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//Etc.
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.Map("api/{**slug}", HandleApiFallback);
endpoints.MapFallbackToFile("{**slug}", "index.html");
});
}
private Task HandleApiFallback(HttpContext context)
{
context.Response.StatusCode = StatusCodes.Status404NotFound;
return Task. CompletedTask;
}

Wasm/Hosted模板对新应用程序的最小更改:

WeatherForecastController.cs

//[Route("[controller]")]
[Route("api/[controller]")]

FetchData.razor

//forecasts = await Http.GetJsonAsync<WeatherForecast[]>("WeatherForecast");
forecasts = await Http.GetJsonAsync<WeatherForecast[]>("api/WeatherForecast");

这正是我们想要运行Blazor WASM应用程序的方式,因为有时我们只想运行API进行测试,而不需要客户端应用程序的开销。例如,我们在启动服务器项目时运行Swagger UI,这样会很有用。

为了实现这一点,我从服务器项目中删除了对客户端项目的引用(我们可能会在不需要的地方实现一些其他软件模式(。然后在每个项目的Properties下添加一个launchSettings.json(如果还没有的话(。

这里有一个例子:

{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:64185",
"sslPort": 44377
}
},
"profiles": {
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"applicationUrl": "https://localhost:7105",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

使用https配置文件,我编辑了两个应用程序的applicationUrl中的端口号。出于某种原因,仅编辑服务器的端口仍然以某种方式为客户端服务。编辑两个端口(通常是相邻的两个端口(似乎可以工作。

相关内容

  • 没有找到相关文章

最新更新