从Unity迁移至Autofac后SiteMapNodes不显示问题求助
我之前也碰到过类似的依赖容器切换导致MvcSiteMapProvider失效的情况,结合你的描述来看,问题大概率出在Autofac与MvcSiteMapProvider的集成配置上——毕竟MvcSiteMapProvider严重依赖DI容器来扫描Action上的自定义节点属性、注册核心服务。下面是几个你可能遗漏的关键步骤:
1. 确保Autofac正确集成MvcSiteMapProvider核心组件
MvcSiteMapProvider有专门的Autofac集成模块,你需要在容器构建时显式注册这个模块,同时确保扫描到你的Controller程序集。如果是传统ASP.NET MVC项目,在Global.asax或Autofac配置类里加上这些代码:
var builder = new ContainerBuilder(); // 注册Mvc控制器 builder.RegisterControllers(typeof(YourMvcApplication).Assembly); // 注册MvcSiteMapProvider的Autofac模块——这一步很容易被忽略! builder.RegisterModule(new MvcSiteMapProviderModule()); // 扫描你的业务程序集,确保带自定义属性的Controller被容器发现 builder.RegisterAssemblyTypes(typeof(MyObjectController).Assembly) .Where(t => typeof(IController).IsAssignableFrom(t)) .PropertiesAutowired(); // 设置Mvc的依赖解析器为Autofac var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
如果是OWIN启动的项目,还要确保在Startup.cs的Configuration方法中,先配置Autofac容器,再初始化MvcSiteMapProvider,顺序不能搞反。
2. 验证自定义SiteMapNode属性的可识别性
你的MyCustomMvcSiteMapNodeAttribute如果是继承自MvcSiteMapNodeAttribute的自定义扩展,要确保MvcSiteMapProvider能正确解析它:
- 确认这个属性所在的程序集被包含在MvcSiteMapProvider的扫描范围内(可以在Web.config的
<scanAssemblies>节点指定,或者在代码配置中通过ScanAssemblies方法添加)。 - 如果自定义属性有额外逻辑,可能需要注册自定义的
ISiteMapNodeAttributeDefinitionProvider来处理它,确保Autofac能找到这个Provider并注入给MvcSiteMapProvider。
3. 排查权限过滤器的兼容性问题
你用到了[AuthorizeRights]权限属性,这个过滤器如果之前依赖Unity的注入逻辑,切换到Autofac后可能无法正常工作。MvcSiteMapProvider的安全修剪功能(如果开启)会根据权限判断是否显示节点,一旦权限验证失败,节点就会被隐藏。
可以先临时注释掉[AuthorizeRights]属性,测试站点地图是否恢复正常。如果恢复了,就需要调整这个权限过滤器的注册方式,确保它能被Autofac正确注入和实例化。
4. 检查MvcSiteMapProvider的核心配置
- 打开Web.config,确认
securityTrimmingEnabled的设置是否符合预期。如果开启了安全修剪但权限验证有问题,子节点会被隐藏。 - 确保
<scanAssemblies>节点里添加了你的项目程序集名称,比如:<mvcSiteMapProvider xmlns="http://mvcsitemapprovider.codeplex.com/schemas/MvcSiteMapProvider-4.0.xsd" securityTrimmingEnabled="true" scanAssembliesForSiteMapNodes="true"> <scanAssemblies> <add assembly="YourProjectAssemblyName"/> </scanAssemblies> </mvcSiteMapProvider>
5. 启用调试日志定位具体问题
如果上面的步骤都没解决,建议开启MvcSiteMapProvider的详细日志,看看扫描节点时有没有报错。在Web.config里添加以下配置:
<system.diagnostics> <sources> <source name="MvcSiteMapProvider" switchName="MvcSiteMapProviderSwitch"> <listeners> <add name="fileListener"/> </listeners> </source> </sources> <switches> <add name="MvcSiteMapProviderSwitch" value="Verbose"/> </switches> <sharedListeners> <add name="fileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="MvcSiteMapProvider.log"/> </sharedListeners> <trace autoflush="true"/> </system.diagnostics>
运行项目后,查看生成的MvcSiteMapProvider.log文件,里面会记录每一个节点的扫描过程,包括是否找到Action、属性解析是否成功、权限验证结果等,能帮你精准定位问题所在。
内容的提问来源于stack exchange,提问作者D Dut

