为何新增设备/浏览器访问时需重启IIS才能加载图片?
新电脑/新浏览器访问时需重启IIS才能加载共享目录图片的问题分析与解决
问题现象
当使用新电脑或新浏览器访问应用时,图片无法正常加载,必须重启IIS才能显示。重启前后的状态如下:
- 重启IIS前:

- 过渡状态:

- 重启IIS后:

当前使用的代码(Program.cs):
app.UseStaticFiles(); NetworkCredential sourceCredentials = new NetworkCredential { Domain = "192.168.84.2", UserName = "sonphat", Password = "it@smcl2019" }; using (new NetworkConnection(@"\\192.168.84.2\Public\ITM\SAPB1", sourceCredentials)) { app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider( Path.GetFullPath(@"\\192.168.84.2\Public\ITM\SAPB1")) }); }
问题根源
核心问题是网络连接的生命周期与静态文件中间件不匹配:
using块仅在应用启动阶段执行一次,执行完成后NetworkConnection会被立即释放,对应的网络访问凭据也随之失效。PhysicalFileProvider是被静态文件中间件长期持有的对象,每次处理请求(尤其是新客户端无缓存、需要读取原始文件时)都会用它访问共享目录,但此时已经没有有效的网络凭据,导致文件读取失败。- 重启IIS时应用重新启动,
using块再次执行并短暂建立连接,此时刚好有请求进来就能完成文件读取,但连接释放后,后续新请求依然会遇到权限问题。
解决方案
方案1:修改应用程序池运行账户(推荐)
直接让IIS应用程序池的运行账户拥有共享目录的访问权限,无需在代码中手动处理网络连接:
- 打开IIS管理器,找到对应应用的应用程序池
- 右键选择「高级设置」
- 在「进程模型」区域修改「标识」为指定账户,输入你代码中的
sonphat用户名和密码 - 重启应用程序池
修改后代码可简化为:
app.UseStaticFiles(); app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider( Path.GetFullPath(@"\\192.168.84.2\Public\ITM\SAPB1")) });
方案2:在请求中间件中添加网络连接(适合无法修改应用池账户的场景)
通过自定义中间件,在每个请求处理时建立网络连接,确保访问共享目录时有有效凭据:
app.UseStaticFiles(); // 自定义中间件,在每个请求周期内维持网络连接 app.Use(async (context, next) => { NetworkCredential sourceCredentials = new NetworkCredential { Domain = "192.168.84.2", UserName = "sonphat", Password = "it@smcl2019" }; using (new NetworkConnection(@"\\192.168.84.2\Public\ITM\SAPB1", sourceCredentials)) { await next.Invoke(); } }); app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider( Path.GetFullPath(@"\\192.168.84.2\Public\ITM\SAPB1")) });
该方式会在每个请求进来时建立网络连接,请求处理完成后自动释放,确保每次访问共享目录都有合法权限。
内容的提问来源于stack exchange,提问作者Phát Sơn
相关产品推荐
相关产品推荐

