ASP.NET Core 1.1部署Azure App Service后路由404问题排查
你遇到的这个404问题很典型——请求被IIS当成静态文件去查找物理路径,说明ASP.NET Core的路由系统根本没接手处理请求。咱们一步步来排查修复:
1. 删掉Program.cs里多余的UseUrls配置
你在WebHostBuilder里硬编码了UseUrls("http://myapp.azurewebsites.net"),这完全没必要。Azure App Service会通过环境变量自动配置应用的监听地址和端口,硬编码反而会导致应用无法响应平台的请求。修改后的代码如下:
var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .Build(); host.Run();
2. 完善Startup.cs的MVC路由配置
你用了AddMvcCore而不是AddMvc,这个方法只提供MVC核心功能,默认不包含路由服务和中间件,得手动补上:
- 在
ConfigureServices里添加路由服务:
public void ConfigureServices(IServiceCollection services) { ... services.AddMvcCore(opts => { opts.ModelBinderProviders.Insert(0, new CommaDelimitedArrayModelBinderProvider()); }) .AddRouting(); // 新增这一行,注册路由服务 ... }
- 必须在
Configure方法里添加路由中间件(你没贴这段代码,但这是关键):
public void Configure(IApplicationBuilder app) { // 确保这一行在其他中间件逻辑之前执行 app.UseMvc(routes => { routes.MapRoute( name: "default", template: "api/{controller=Values}/{action=Get}/{id?}"); }); }
如果没有UseMvc,请求根本不会进入MVC路由处理链,自然会被IIS当成静态文件去查找物理路径。
3. 修正Web.config的拼写错误
你的web.config里stdoutLogEnabled="flase"是拼写错误(应该是false),这个错误会导致你无法生成标准输出日志,没法排查后续问题。修正后:
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
如果需要排查启动日志,可以把stdoutLogEnabled改成true,Azure会在D:\home\site\wwwroot\logs下生成日志文件。
4. 验证部署包内容
确保你部署的是发布后的编译输出文件,而不是项目源码。可以通过Kudu控制台(https://myapp.scm.azurewebsites.net)查看D:\home\site\wwwroot目录,里面应该包含你的dll文件、web.config和依赖文件,而不是cs源码。
最后检查控制器路由特性
确认你的ValuesController类上标注了正确的路由特性,这样才能匹配api/values路径:
[Route("api/[controller]")] public class ValuesController : Controller { // GET api/values [HttpGet] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } }
按照上面的步骤调整后重新发布,应该就能正常访问api/values了。
内容的提问来源于stack exchange,提问作者Mihail Katrikh

