ASP.NET Core Blazor访问网络共享图片1分钟后报404问题咨询
问题根因
你在Startup.Configure方法中将NetworkConnection的初始化放在了using代码块中,Configure方法执行完成后,using块会自动触发Dispose逻辑,直接断开了SMB共享连接。应用启动初期连接还未完全释放时可以正常访问资源,等连接释放完成后所有对共享路径的读写请求都会因无有效连接失败,表现为静态资源返回404、写入文件仅生成0KB空文件。
修复方案
将网络共享连接注册为全局单例,保证应用整个运行生命周期内连接不会被主动释放,调整后的代码如下:
1. 修改Startup.cs的ConfigureServices方法
增加网络连接单例注册:
public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddServerSideBlazor(); services.AddSingleton<WeatherForecastService>(); // 新增:注册网络共享连接为全局单例,应用生命周期内保持连接 services.AddSingleton(sp => { var sourceCredentials = new NetworkCredential { Domain = "192.168.1.162", UserName = "ImageManager", Password = "qwer1234)" }; return new NetworkConnection(@"\\192.168.1.162\Images\Photos2", sourceCredentials); }); }
2. 修改Startup.cs的Configure方法
移除using代码块,先获取已注册的连接实例再配置静态文件服务:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); // 新增:获取全局网络连接实例,保证共享连接已建立 var networkConn = app.ApplicationServices.GetRequiredService<NetworkConnection>(); // 移除原有的using包裹,直接配置文件服务 app.UseFileServer(new FileServerOptions() { FileProvider = new PhysicalFileProvider(@"\\192.168.1.162\Images\Photos2"), RequestPath = new PathString("/Photos2"), EnableDirectoryBrowsing = true }); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapBlazorHub(); endpoints.MapFallbackToPage("/_Host"); }); }
附加优化建议
- 生产环境部署到IIS时,建议将应用程序池的运行标识调整为拥有共享路径读写权限的域账号或本地账号,降低连接异常概率
- 长期运行场景下可在
NetworkConnection类中增加保活逻辑,比如每隔30秒访问一次共享路径下的测试文件,避免网络波动导致连接被动断开 - 写入共享文件时建议先写入本地临时目录,写入完成后再移动到共享路径,避免网络波动直接生成0KB无效文件
内容的提问来源于stack exchange,提问作者mike g
相关产品推荐
相关产品推荐

