使用Umbraco 12时如何注册常规ASP.NET Core MVC控制器?
解决Umbraco 12中自定义ASP.NET Core MVC路由返回404的问题
问题出在Umbraco路由的匹配优先级上——UseWebsiteEndpoints()注册的Umbraco内容路由会优先捕获所有请求,导致你的自定义PayPal路由被覆盖了。按下面的方式调整代码就能解决:
- 调整路由注册顺序:把自定义MVC路由的注册代码放到
UseWebsiteEndpoints()之前,让自定义路由先被匹配。 - 确认控制器类型:确保你的
PayPalController是常规的ASP.NET Core MVC控制器(继承Controller基类,而非Umbraco的SurfaceController或RenderController)。
修改后的Configure方法代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseUmbraco() .WithMiddleware(u => { u.UseBackOffice(); u.UseWebsite(); }) .WithEndpoints(u => { u.UseInstallerEndpoints(); u.UseBackOfficeEndpoints(); // 先注册自定义PayPal路由 u.EndpointRouteBuilder.MapControllerRoute( "PayPal", "paypal/{action}", new { controller = "PayPal", action = "Index" }); // 再注册Umbraco网站路由 u.UseWebsiteEndpoints(); }); }
如果你的控制器和Umbraco的控制器存在命名空间冲突,还可以在路由注册时指定命名空间,进一步明确匹配规则:
u.EndpointRouteBuilder.MapControllerRoute( "PayPal", "paypal/{action}", new { controller = "PayPal", action = "Index" }) .AddArea("") // 空区域表示非区域控制器 .RequireControllerNamespaces(new[] { "YourProjectNamespace.Controllers" });
这样调整后,访问/paypal或/paypal/[ActionName]时就会优先匹配你的自定义控制器,不会被Umbraco的404页面拦截了。
内容的提问来源于stack exchange,提问作者furybg
相关产品推荐
相关产品推荐

