.NET 8 Blazor Web App部署IIS后无法访问本地/局域网PDF
调试阶段,本地和Web App服务器都能正常从绝对路径打开PDF,但部署到IIS后,无论是本地还是局域网内都无法访问。已设置应用程序池身份为LocalSystem(最高权限),且存放PDF的文件夹已对所有账户开放权限,问题仍未解决。想排查还有哪些权限相关的操作遗漏,相关代码如下:
@code { string filepath = @"c:\\users\myusers\myfolder\ + filename; byte[] fileBytes = await File.ReadAllBytesAsync(filepath); string base64 = Convert.ToBase64String(fileBytes); string dataUri = $"data:application/pdf;base64,{base64}"; await JSRuntime.InvokeVoidAsync("eval", $@" var win = window.open(); win.document.write('<iframe src=""{dataUri}"" frameborder=""0"" style=""border:0; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%;"" allowfullscreen></iframe>'); "); }
其中filename为查询结果。
排查解决方案:
开启应用程序池的「加载用户配置文件」选项
IIS默认可能未开启该选项,即便使用LocalSystem身份,未加载用户配置文件时,访问C:\Users\下的目录会触发权限限制(用户目录的权限依赖于用户配置加载)。操作步骤:IIS管理器→找到对应应用程序池→高级设置→进程模型→加载用户配置文件,设置为True。修正代码路径语法错误
原代码中filepath的拼接存在语法错误:@"c:\\users\myusers\myfolder\ + filename;缺少闭合双引号,且转义符冗余(@符号开头的字符串不需要双反斜杠)。建议改用Path.Combine避免手动拼接错误:string filepath = Path.Combine(@"C:\Users\myusers\myfolder", filename);检查杀毒软件/Windows Defender拦截
部分杀毒软件会阻止IIS进程(w3wp.exe)访问用户目录下的文件,即便权限设置正确也会被拦截。可临时关闭防护软件测试,或把PDF文件夹添加到防护排除列表。确认路径大小写与实际匹配
虽然Windows文件系统不区分大小写,但IIS进程在某些配置下可能对大小写敏感,确保代码中的路径与实际文件夹、文件名完全一致(包括大小写)。检查IIS请求筛选规则
即便你是读取文件内容转Base64而非直接请求文件路径,仍需确认IIS的请求筛选是否存在阻止相关操作的规则:IIS管理器→对应网站→请求筛选→规则,排查是否有拦截逻辑。
内容的提问来源于stack exchange,提问作者redrum1337

