在 kestrel 中托管 blazor wasm asp.net 核心托管应用

时间:2021-02-25 11:56:23

标签: asp.net-core blazor blazor-webassembly kestrel-http-server

我在托管 blazor wasm asp.net core hosted 应用程序时遇到问题。该解决方案有 3 个项目:客户端共享服务器 .

当我运行命令 dotnet publish --configuration Release 时,它将库发布到它们各自的解决方案文件夹中,如下所示:

  • WebWorkbench3\客户端\bin\Release\net5.0\publish
  • WebWorkbench3\服务器\bin\Release\net5.0\publish
  • ...

我认为由于 server 项目引用了 client - 那么我托管应用程序的步骤如下:

  1. 在 powershell 中打开 WebWorkbench3\Server\bin\Release\net5.0\publish
  2. 运行命令 dotnet .\WebWorkbench3.Server.dll

enter image description here

  1. 导航到:https://localhost:5001/
  2. 结果:
  • 预期:客户页面打开
  • 实际:页面卡在“正在加载..”字符串处。在控制台中,我们看到有关 _framework/blazor.webassembly.js 未加载的错误。

enter image description here

  1. 如果我们要检查服务器应用程序中的 wwwroot 文件夹内容,我们将看到以下内容:

enter image description here

所以这解释了为什么会显示错误。但是,此时我的问题是 - 项目中的发布过程/配置是否应该负责复制客户端的 wwwroot 内容到服务器的应用程序输出目录中?如果我们在 VisualStudio 中启动调试会话,那么我们使用 server 作为启动点,因此项目应该知道在哪里查找 blazor.webassembly.js 文件位于..

enter image description here

那么为什么在发布过程中没有发生同样的过程?

注意:我能够通过手动复制客户端的 wwwroot 目录并将内容放入服务器的 wwwroot 目录中来解决该问题...但我没有难道这不应该是服务的工作方式吗?

编辑:我刚刚尝试在 IIS 中设置 client blazor 应用程序。它有效。的种类。页面打开。但是当它尝试向服务器发出 REST GET 请求时 - 它使用相同的 hostname:port 组合。因此,如果我的应用托管在 mysite.local:50001 上,那么对 API 的请求将类似于 mysite.local:50001/data/loadall,其中 data 是控制器名称,loadall 是操作名称。所以基本上客户端使用与服务器相同的基地址。问题是我无法在与客户端相同的端口上启动服务器!尝试这样做 - 您将看到以下输出: enter image description here

所以基本上我有和以前一样的问题 - 如何托管在客户端和服务器之间拆分的 wasm 应用程序?我很确定我可以通过强制客户端使用非标准服务器端口并在该端口上提供 server 部分来使其工作。但是,我相信当前配置(默认blazor wasm 模板中的配置)是以这种方式配置的,因此应该可以以某种方式运行该项目,而无需进行任何其他更改..

1 个答案:

答案 0 :(得分:1)

好吧,这将是一个自我回答......而不是在解决方案级别发布 (dotnet publish --configuration Release) 应用程序 - 在项目级别发布......

  • ..\repos\WebWorkbench3\WebWorkbench3之前
  • ..\repos\WebWorkbench3\WebWorkbench3\Server之后

在 1 种情况下,编译器不会将 _framework 文件夹(可能还有一些其他文件)复制到 wwwroot 中。一旦您正确发布了服务器,您就可以通过为它提供服务来访问该应用程序dotnet .\WebWorkbench3.Server.dll 命令。