Nopcommerce 4.5:无需跳转至/pagenotfound,原URL显示404视图
解决NopCommerce 4.5原URL直接显示404视图而非跳转的方案
假设你已经在NopRoutingStartup.cs中注册了Custom404Middleware,以下是将自定义文本替换为指定404视图的具体步骤:
1. 调整中间件注册顺序
确保你的Custom404Middleware注册在NopCommerce默认路由中间件之后,这样才能正确捕获未匹配路由的请求。在NopRoutingStartup.cs的Configure方法中,注册位置参考如下:
app.UseStaticFiles(); // 其他业务中间件... app.UseRouting(); // 注册自定义404中间件 app.UseMiddleware<Custom404Middleware>(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
2. 修改Custom404Middleware实现
通过注入视图渲染相关服务,直接在原URL上渲染指定404视图,核心逻辑是捕获未处理的404请求,渲染视图并写入响应(保留原URL和404状态码)。修改后的中间件代码示例:
public class Custom404Middleware { private readonly RequestDelegate _next; private readonly IViewEngine _viewEngine; private readonly ITempDataProvider _tempDataProvider; private readonly ILogger<Custom404Middleware> _logger; public Custom404Middleware(RequestDelegate next, IViewEngine viewEngine, ITempDataProvider tempDataProvider, ILogger<Custom404Middleware> logger) { _next = next; _viewEngine = viewEngine; _tempDataProvider = tempDataProvider; _logger = logger; } public async Task InvokeAsync(HttpContext context) { await _next(context); // 仅处理未被修改的404请求,且响应未开始发送 if (context.Response.StatusCode == StatusCodes.Status404NotFound && !context.Response.HasStarted) { try { // 重置响应状态,避免之前的响应头干扰 context.Response.Clear(); context.Response.StatusCode = StatusCodes.Status404NotFound; // 指定要渲染的404视图路径 var viewName = "~/Views/Shared/NotFound.cshtml"; var viewResult = _viewEngine.FindView(context, viewName, isMainPage: false); if (!viewResult.Success) { _logger.LogError($"无法找到目标404视图: {viewName}"); await context.Response.WriteAsync("404 - 页面未找到"); return; } // 构建视图上下文 var viewContext = new ViewContext( new ActionContext(context, context.GetRouteData(), new ActionDescriptor()), viewResult.View, new ViewDataDictionary(new EmptyModelMetadataProvider(), context.ModelState), new TempDataDictionary(context, _tempDataProvider), context.Response.Body, new HtmlHelperOptions() ); // 渲染视图到响应流 await viewResult.View.RenderAsync(viewContext); } catch (Exception ex) { _logger.LogError(ex, "渲染404视图时发生异常"); await context.Response.WriteAsync("404 - 页面未找到"); } } } }
3. 禁用NopCommerce默认404跳转
NopCommerce默认会将404请求重定向到/pagenotfound,需要关闭该行为:
- 登录后台管理系统,进入配置 > 常规设置 > 显示设置
- 找到「页面未找到URL」选项,清空输入框并保存
- 或直接在
appsettings.json中添加配置:
"NopCommerce": { "GeneralSettings": { "PageNotFoundUrl": "" } }
4. 验证效果
启动应用后,访问任意不存在的URL(如/invalid-path),浏览器会在原URL上直接显示你指定的NotFound.cshtml视图内容,同时网络请求状态码保持为404,无跳转行为。
内容的提问来源于stack exchange,提问作者confusedMind
相关产品推荐
相关产品推荐

