在 kestrel 中托管 blazor wasm asp.net 核心托管应用程序
Hosting blazor wasm asp.net core hosted app in kestrel
我在托管 blazor wasm asp.net core hosted
应用程序时遇到问题。解决方案有 3 个项目:Client、Shared 和服务器.
当我 运行 命令 dotnet publish --configuration Release
时,它将库发布到解决方案中各自的文件夹,如下所示:
- WebWorkbench3\客户端\bin\Release\net5.0\publish
- WebWorkbench3\服务器\bin\Release\net5.0\publish
- ...
我假设因为 server
项目引用了 client
- 那么我托管应用程序的步骤如下:
- 在 powershell
中打开 WebWorkbench3\Server\bin\Release\net5.0\publish
- 运行命令
dotnet .\WebWorkbench3.Server.dll
- 导航至:
https://localhost:5001/
- 结果:
- 预期: 客户端页面已打开
- 实际: 页面卡在“正在加载..”字符串处。在控制台中,我们看到有关于
_framework/blazor.webassembly.js
未加载的错误。
- 如果我们要检查服务器应用程序中的
wwwroot
文件夹内容,我们将看到以下内容:
所以这解释了显示错误的原因。但是我现在的问题是 - 项目中的发布 process/configuration 是否应该负责 copying 客户端的 wwwroot
内容到服务器的应用程序输出目录中?如果我们在 VisualStudio 中启动调试会话,那么我们使用 server
作为启动点,因此项目应该知道在哪里查找 blazor.webassembly.js
文件 at..
那么为什么在发布过程中没有发生相同的过程?
注意: 我能够通过手动复制客户端的 wwwroot
目录并将内容放入服务器的 wwwroot
目录来解决问题。 .. 但我不认为这是服务应该如何工作?
编辑: 我刚刚尝试在 IIS 中设置 client
blazor 应用程序。它有效。有点儿。页面打开。但是当它尝试向服务器发出 REST GET 请求时 - 它使用相同的 hostname:port
组合。因此,如果我的应用托管在 mysite.local:50001
上,那么对 API 的请求将类似于 mysite.local:50001/data/loadall
,其中 data
是控制器名称,loadall
是操作名称。 .所以基本上客户端使用与服务器相同的基地址..问题是我不能在与客户端相同的端口上启动服务器!尝试这样做 - 您将看到以下输出:
所以基本上我有和以前一样的问题 - 如何托管在客户端和服务器之间拆分的 wasm 应用程序?我很确定我可以通过强制客户端使用非标准服务器端口并在该端口上提供 server
部分来使其工作。但是,我相信当前配置(默认blazor wasm 模板中的配置)以这种方式配置,因此应该可以 运行 项目以某种方式完全不需要任何其他更改..
好吧,这将是一个自我回答..而不是在解决方案级别发布 (dotnet publish --configuration Release
) 应用程序 - 在项目级别发布..
- 之前
..\repos\WebWorkbench3\WebWorkbench3
- 在
..\repos\WebWorkbench3\WebWorkbench3\Server
之后
在 1 种情况下,编译器不会将 _framework
文件夹(可能还有一些其他文件)复制到 wwwroot
.. 正确发布服务器后,您可以通过服务访问该应用程序它与 dotnet .\WebWorkbench3.Server.dll
命令。
遇到上述问题:
之前:
解决方案文件
- 同名
- 在同一个文件夹中
作为服务器项目
已解决
我将解决方案移至项目根目录(上一级)。
现在,服务器项目中的 dotnet publish
按预期生成了 __framework
文件夹 + 内容。
我在托管 blazor wasm asp.net core hosted
应用程序时遇到问题。解决方案有 3 个项目:Client、Shared 和服务器.
当我 运行 命令 dotnet publish --configuration Release
时,它将库发布到解决方案中各自的文件夹,如下所示:
- WebWorkbench3\客户端\bin\Release\net5.0\publish
- WebWorkbench3\服务器\bin\Release\net5.0\publish
- ...
我假设因为 server
项目引用了 client
- 那么我托管应用程序的步骤如下:
- 在 powershell 中打开
- 运行命令
dotnet .\WebWorkbench3.Server.dll
WebWorkbench3\Server\bin\Release\net5.0\publish
- 导航至:
https://localhost:5001/
- 结果:
- 预期: 客户端页面已打开
- 实际: 页面卡在“正在加载..”字符串处。在控制台中,我们看到有关于
_framework/blazor.webassembly.js
未加载的错误。
- 如果我们要检查服务器应用程序中的
wwwroot
文件夹内容,我们将看到以下内容:
所以这解释了显示错误的原因。但是我现在的问题是 - 项目中的发布 process/configuration 是否应该负责 copying 客户端的 wwwroot
内容到服务器的应用程序输出目录中?如果我们在 VisualStudio 中启动调试会话,那么我们使用 server
作为启动点,因此项目应该知道在哪里查找 blazor.webassembly.js
文件 at..
那么为什么在发布过程中没有发生相同的过程?
注意: 我能够通过手动复制客户端的 wwwroot
目录并将内容放入服务器的 wwwroot
目录来解决问题。 .. 但我不认为这是服务应该如何工作?
编辑: 我刚刚尝试在 IIS 中设置 client
blazor 应用程序。它有效。有点儿。页面打开。但是当它尝试向服务器发出 REST GET 请求时 - 它使用相同的 hostname:port
组合。因此,如果我的应用托管在 mysite.local:50001
上,那么对 API 的请求将类似于 mysite.local:50001/data/loadall
,其中 data
是控制器名称,loadall
是操作名称。 .所以基本上客户端使用与服务器相同的基地址..问题是我不能在与客户端相同的端口上启动服务器!尝试这样做 - 您将看到以下输出:
所以基本上我有和以前一样的问题 - 如何托管在客户端和服务器之间拆分的 wasm 应用程序?我很确定我可以通过强制客户端使用非标准服务器端口并在该端口上提供 server
部分来使其工作。但是,我相信当前配置(默认blazor wasm 模板中的配置)以这种方式配置,因此应该可以 运行 项目以某种方式完全不需要任何其他更改..
好吧,这将是一个自我回答..而不是在解决方案级别发布 (dotnet publish --configuration Release
) 应用程序 - 在项目级别发布..
- 之前
..\repos\WebWorkbench3\WebWorkbench3
- 在
..\repos\WebWorkbench3\WebWorkbench3\Server
之后
在 1 种情况下,编译器不会将 _framework
文件夹(可能还有一些其他文件)复制到 wwwroot
.. 正确发布服务器后,您可以通过服务访问该应用程序它与 dotnet .\WebWorkbench3.Server.dll
命令。
遇到上述问题:
之前:
解决方案文件
- 同名
- 在同一个文件夹中
作为服务器项目
已解决
我将解决方案移至项目根目录(上一级)。
现在,服务器项目中的 dotnet publish
按预期生成了 __framework
文件夹 + 内容。