【问题标题】:In Blazor WebAssembly solution, how to host the Blazor WASM client app on a different port to the server API在 Blazor WebAssembly 解决方案中,如何在与服务器 API 不同的端口上托管 Blazor WASM 客户端应用程序
【发布时间】:2020-07-22 00:26:06
【问题描述】:

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

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

当您点击调试时,它会完美运行。

现在我想更改它,以便我的所有 Blazor WASM 页面都由 https://localhost:44331 提供服务,而服务器应用程序的 API 控制器端点则由 https://localhost:44331/api 提供服务

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

我希望很清楚我想要做什么。

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

这会破坏一切。

现在“https://localhost:44331/”将我带到一个 404 Not Found 错误,而“https://localhost:44331/api”将我带到一个页面,上面写着:

加载中...
发生了未处理的错误。重新加载????

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

【问题讨论】:

  • 你用的是什么版本?最近此模型发生了一些变化。
  • 我在 Microsoft Visual Studio Community 2019 Preview Version 16.6.0 Preview 2.1。 WASM 应用程序以 Netstandard2.1 和 RazorLang 3.0 为目标。 Web API 以 netcoreapp3.1 为目标。两者都在 C# 8.0 中。

标签: asp.net-core blazor iis-express blazor-client-side asp.net-core-staticfile


【解决方案1】:

好的!我终于想出了一个可行的方法。这并不复杂,但我花了 几天 才得到答案,所以我将把它贴在这里,因为我认为它对其他人有用。

在您的控制器上:

[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;
        }

【讨论】:

  • 你能解释一下这里的 {**slug} 是什么意思吗?
【解决方案2】:

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

WeatherForecastController.cs

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

FetchData.razor

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

【讨论】:

  • 感谢您的快速响应,Henk!当应用程序以这种方式设置时,Blazor 应用程序仍会拦截对localhost:44331/api/anything 的请求并显示一个页面,上面写着“此地址没有任何内容”。如果可能的话,我希望这样的请求能够从 Web api 传递原始 JSON,或者一个错误,而不是 Blazor WASM 应用程序上的页面,因为我只希望客户端应用程序在 URL 没有时参与“/api”路径。你明白我的意思吗?
  • 嗨@henk-holterman!我希望你一切都好。我想知道您是否有机会查看此内容并知道如何配置控制器回退以便“/api”路由不会路由到 Blazor 客户端应用程序?
  • 谢谢你,亨克!对于 ASP-NET-Core 的人,下面是我第一次尝试解决方案。它似乎完成了工作,但我很高兴知道这是否是标准和正确的方法:
猜你喜欢
  • 1970-01-01
  • 2020-12-18
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 2020-05-17
  • 1970-01-01
  • 2020-09-26
相关资源
最近更新 更多