首页 > 解决方案 > IIS / Server 2019 上的 Blazor 静态文件 404 错误,但不是 IIS Express / Win10

问题描述

基本问题是,在 IIS Express 下的 Win10 桌面上运行良好的 .NET Core 3.1 Blazor 服务器端应用程序在移至在 IIS 下以进程内运行的 Server 2019 时无法提供 _Host.cshtml 中引用的静态内容(运行在 VS2019 下调试,未发布/部署)。CSS 或 JS 文件等常规静态内容会导致 HTTP 404 not-found 错误。Blazor 应用程序本身运行良好,客户端浏览器(仍在我的桌面上运行)能够读取嵌入的内容(例如 JS 文件)以建立 websocket 连接。

这似乎是一个安全问题。我意识到理论上静态内容是匿名提供的。但是从受身份验证保护的 Blazor 页面请求的两个静态文件(一个图像文件和一个 CSS 文件)确实可以正常服务。但是,正常工作的 IIS Express 版本配置为禁用匿名身份验证并启用 Windows 身份验证。我相信我已经以相同的方式配置了 IIS(如下)。

细节:

这是一个有点复杂的 Blazor 服务器端应用程序,最初是在我的本地工作站上开发了几个月。然后在我们争论是否使用 Blazor 时,它被搁置了几个月。公司政策是使用专用服务器虚拟机作为开发环境,所以我从 git repo 将其拉到服务器上,但除了调整一些路径和切换到 IIS 之外,代码是相同的。两个可能相关的因素是它是一个企业应用程序,因此它涉及 Windows 身份(LAN ID 和 AD 组),并且不应允许匿名访问。

默认 IIS 站点和所有默认应用程序池已被删除。有一个站点指向一个空目录,该目录是绑定的主目录(本地主机和机器的 FQDN 的端口 80 和 443)。Web 应用程序的应用程序池遵循所有常规规则——没有托管 CLR、AppPoolIdentity 等。站点身份验证和 Web 应用程序身份验证启用了 Windows 身份验证并禁用了匿名。该站点本身也有一个专用的非托管应用程序池。我知道 AppPoolIdentity 是如何工作的,并且 csproj 文件夹确实具有正确虚拟帐户的正确权限,并且这些权限被继承到 wwwroot 等等。

作为测试,我在服务器上使用 SSL 创建了一个新的 Blazor 模板应用程序(但没有我们从未使用过的 ASP.NET 标识),然后我以相同的方式在 IIS 中设置了一个新的 Web 应用程序和池,它工作正常。当然,这没有身份验证,这再次告诉我这是一个安全问题,但我找不到任何其他可以调整的地方。

标签: asp.net-coreiisblazor-server-side

解决方案


感谢 Jalpa Panchal 建议运行失败的请求跟踪,我意识到 IIS 试图从父站点(具有 IP 和端口绑定的空目录)而不是虚拟 Web 应用程序提供文件。

如问题中所述,这些是引用的文件,可以通过在and标记前加上波浪号_Host.cshtml来快速轻松地解决此问题。hrefsrc


推荐阅读