You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向现有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:00:54