向现有MVC项目添加Blazor后IIS部署出现端点匹配冲突问题
解决IIS部署后Blazor路由冲突(AmbiguousMatchException)
问题分析
本地运行正常,但IIS部署后访问/test出现AmbiguousMatchException,提示请求匹配了两个/_Host端点,核心原因大概率是部署环境中路由注册重复或编译文件残留,也可能是生产环境下的配置冲突。
排查与解决步骤
1. 清理部署目录并重新发布
- 停止IIS站点,删除QA环境站点根目录下的所有文件(包括
bin、obj、wwwroot等)。 - 在Visual Studio中选择发布到文件夹,勾选删除目标文件夹中的现有文件,重新部署到IIS。
- 启动站点后再次测试
/test路径。
2. 调整回退路由配置
在Startup.cs的UseEndpoints中,将模糊的回退路由改为明确指定页面名称的写法,避免Razor Pages路由系统与Blazor回退路由产生冲突:
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapRazorPages(); endpoints.MapBlazorHub(); // 修改为明确指定页面的回退路由 endpoints.MapFallbackToPage("/_Host", "/_Host"); });
3. 移除生产环境的Razor运行时编译
全局启用AddRazorRuntimeCompilation仅适用于开发环境,生产环境启用可能导致路由扫描重复,修改Startup.cs中的服务配置:
var mvcBuilder = services.AddControllersWithViews().AddNewtonsoftJson(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore ).AddMvcOptions(options => { options.ModelBinderProviders.Insert(0, new JsonModelBinderProvider()); }); // 仅在开发环境添加Razor运行时编译 if (env.IsDevelopment()) { mvcBuilder.AddRazorRuntimeCompilation(); } mvcBuilder.AddRazorOptions(opt => { opt.ViewLocationFormats.Add("/Views/Shared/AvailHeader/{0}.cshtml"); opt.ViewLocationFormats.Add("/Views/Shared/HeaderSearch/{0}.cshtml"); opt.ViewLocationFormats.Add("/Views/Shared/Partials/{0}.cshtml"); });
4. 检查IIS配置
- 确认站点的应用程序池托管管道模式为
集成,.NET CLR版本设置为无托管代码(针对ASP.NET Core项目)。 - 确保服务器安装了对应版本的ASP.NET Core托管捆绑包,避免模块兼容性问题。
5. 验证_Host.cshtml的路由唯一性
确认项目中仅存在一个_Host.cshtml,且其@page "/blazor"指令没有重复定义。如果不需要直接访问/blazor路径,可以移除该@page指令,仅保留回退路由指向它。
内容的提问来源于stack exchange,提问作者Mr. Spock
相关产品推荐
相关产品推荐

