使用模板:启用了 ASP.NET Core 托管的 Blazor WebAssembly 应用程序
它创建项目:
- BlazorApp1.Client
- BlazorApp1.Server
我可以看到服务器有一个对客户端的项目引用,但我无法确定哪些代码允许服务器显示客户端?
服务器如何知道客户端索引文件在另一个程序集中?
客户端代码是否托管在同一端口上的服务器项目中?
试图弄清楚这一点,我有点迷失了。
使用模板:启用了 ASP.NET Core 托管的 Blazor WebAssembly 应用程序
它创建项目:
我可以看到服务器有一个对客户端的项目引用,但我无法确定哪些代码允许服务器显示客户端?
服务器如何知道客户端索引文件在另一个程序集中?
客户端代码是否托管在同一端口上的服务器项目中?
试图弄清楚这一点,我有点迷失了。
项目引用就在那里,以便 MsBuild (VS) 可以将客户端文件复制到服务器的 bin 目录。
然后服务器有一个特殊的中间件组件来服务客户端。以下几行都是关于提供静态文件的:
app.UseBlazorFrameworkFiles();
app.UseStaticFiles();
服务器实际上并不链接或引用客户端中的任何代码。
客户端代码是否托管在同一端口上的服务器项目中?
是的,只是为了方便。您可以在其他地方托管客户端(但也要考虑 CORS 设置)。
我无法确定哪些代码允许服务器显示客户端?
UseEndPoints 的最后一行会发生这种情况:
endpoints.MapControllers(); // handle /api
endpoints.MapFallbackToFile("index.html"); // everything else
请注意,因此您的 API 将永远不会返回 404 代码。它将返回您的客户端应用程序的“这里没有”页面。您会看到“HTML 不是 JSON”相关的错误。
要添加到 Henk 的答案:
index.html 属于 Client 项目。它不会在编译时被复制。如何在运行时访问 index.html?它是否嵌入在其中一个 DLL 中?
这是我问自己的问题。看起来当您在服务器的 bin/ 目录中生成文件时,BlazorApp2.Server.staticwebassets.runtime.json
您的文件名会有所不同。
该文件包含您机器上 wwwroot 的绝对路径,以及该目录中所有文件的相对路径 - index.html 就是其中之一。
在dotnet publish
输出目录上将包含 wwwroot 及其内容。