You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Core 8.0 在非启动程序集中配置MapRazorPages的问题

ASP.NET Core 8.0 在非启动程序集中配置MapRazorPages的问题

我完全懂你碰到的这个坑——当你从WPF应用(作为启动程序集)引用独立的Razor Pages程序集时,MapRazorPages()默认只会扫描当前启动程序集里的页面,导致你的页面根本没被注册到路由表,自然就全是404了。这个问题解决起来其实很直接,只需要告诉ASP.NET Core要额外扫描指定的程序集就行。

核心解决思路

MapRazorPages()的页面注册逻辑依赖于服务配置阶段的AddRazorPages()配置,我们可以通过AddApplicationPart扩展方法,手动指定要扫描的Razor Pages所在的程序集。

具体修改步骤

  1. 在Razor Pages程序集中添加一个标记类(可选但推荐)
    为了安全地获取目标程序集对象,建议在你的独立Razor Pages程序集里加一个空的标记类,避免硬编码程序集名称:

    // 放在你的Razor Pages程序集的任意位置
    public class RazorPagesAssemblyMarker { }
    
  2. 在服务配置阶段添加程序集扫描
    找到你配置ASP.NET服务的地方(也就是你的ConfigAspNetServices方法),在AddRazorPages()之后调用AddApplicationPart,传入Razor Pages程序集的引用:

    // 修改你的ConfigAspNetServices中的服务配置代码
    public void Config()
    {
        // ... 其他服务配置代码 ...
        
        builder.Services.AddRazorPages()
            // 关键:添加这一行,指定要扫描的Razor Pages程序集
            .AddApplicationPart(typeof(RazorPagesAssemblyMarker).Assembly);
        
        // ... 其他服务配置代码 ...
    }
    

    如果你不想用标记类,也可以直接通过程序集名称加载(但标记类的方式更可靠):

    .AddApplicationPart(System.Reflection.Assembly.Load("YourRazorPagesAssemblyName"))
    
  3. 确认中间件管道配置正确
    你现有的HttpRequestPipeline里的app.MapRazorPages()位置是对的(在UseAuthorization()之后),不需要修改这部分代码。

为什么这样能解决问题?

ASP.NET Core的Razor Pages(以及MVC)使用应用部件(Application Parts)来发现控制器、页面等组件,默认只加载启动程序集的应用部件。通过AddApplicationPart,我们把额外的程序集加入到扫描列表中,MapRazorPages()就能找到这些程序集里的页面了。

额外检查点

  • 确保WPF项目已经正确引用了Razor Pages程序集,并且程序集被设置为“复制到输出目录”(默认引用会自动处理)
  • 如果你用了Area,还需要针对Area的程序集做类似配置(AddAreaPageRoute或者额外的AddApplicationPart
  • 启动后可以通过你已有的UseRouteDebugger查看路由表,确认Razor Pages的路由是否已经被注册

备注:内容来源于stack exchange,提问作者John Melville

火山引擎 最新活动