.NET Core 1 WebAPI如何将指定目录设为公开并由IIS直接处理
我太懂你之前用控制器返回静态文件的痛点了——不仅占CPU,延迟还高。要实现让IIS直接处理/public路径下的文件请求,其实只需要两步配置就能搞定,完全适配你的项目结构和需求。
第一步:配置ASP.NET Core静态文件中间件
首先在Startup.cs的Configure方法里,添加静态文件中间件的自定义配置,把/public请求路径映射到你实际的wwwroot/public物理目录。这样ASP.NET Core会先识别这类请求,直接交给静态文件处理逻辑,而不用走控制器流程。
代码示例:
using Microsoft.AspNetCore.StaticFiles; using System.IO; public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // 先保留你原有的其他中间件配置(比如路由、认证等) // 配置静态文件映射规则 app.UseStaticFiles(new StaticFileOptions { RequestPath = "/public", FileProvider = new PhysicalFileProvider( Path.Combine(env.ContentRootPath, "wwwroot", "public")) }); // 后续其他中间件... }
这里的RequestPath指定了URL里的前缀/public,FileProvider则指向你存放静态文件的实际物理目录,不管是根目录下的logo.png还是子目录subdir里的icon1.png,都会被正确映射。
第二步:配置IIS直接接管静态文件请求
默认情况下,ASP.NET Core模块会接管所有请求,为了彻底让IIS直接处理这些静态文件(进一步降低CPU占用和延迟),你需要在web.config里添加一个处理规则,让IIS的静态文件模块直接处理public/*的请求,不用转发给ASP.NET Core。
在web.config的<system.webServer>节点下添加以下配置:
<handlers> <!-- 让IIS原生模块处理public路径下的所有静态文件 --> <add name="PublicStaticFiles" path="public/*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" /> </handlers>
这个配置告诉IIS:所有匹配public/*的请求,直接用IIS原生的静态文件模块处理,完全绕过ASP.NET Core的管道,性能会得到极大提升。
最后验证
部署配置后的项目,直接访问你想要的URL:
https://MyAPIDomain.com/public/logo.pnghttps://MyAPIDomain.com/public/subdir/icon1.png
你会发现图片能正常加载,同时服务器的CPU使用率和请求延迟都会比之前用控制器的方案低很多——因为现在是IIS直接返回文件,完全不需要ASP.NET Core控制器参与。
另外要注意:确保wwwroot/public目录的权限正确,IIS应用池的运行身份需要有该目录的读取权限;如果你的项目之前没引用Microsoft.AspNetCore.StaticFiles包,记得通过NuGet安装它(.NET Core 1的Web模板一般默认包含,但保险起见可以检查一下)。
内容的提问来源于stack exchange,提问作者Ahmad Behzadi

