Optimizely 11.20第三方插件初始化时路由约束解析失败求助
问题原因
TedGustaf.Episerver.AdaptiveImages插件的初始化模块在映射属性路由时,使用了未添加自定义约束的默认DefaultInlineConstraintResolver实例,而你的自定义约束仅在手动创建的解析器中注册,导致插件解析路由时找不到objectType约束。
解决方案
1. 创建自定义内联约束解析器
继承DefaultInlineConstraintResolver,在构造函数中预先添加自定义约束映射:
public class CustomInlineConstraintResolver : DefaultInlineConstraintResolver { public CustomInlineConstraintResolver() { ConstraintMap.Add("objectType", typeof(ObjectTypeConstraint)); ConstraintMap.Add("market", typeof(MarketConstraint)); } }
2. 注册自定义解析器到EPiServer依赖注入
创建EPiServer初始化模块,确保在插件初始化前将自定义解析器注册为全局单例服务:
[InitializableModule] // 指定此模块在插件初始化模块之前执行 [InitializationModule(typeof(TedGustaf.Episerver.AdaptiveImages.Initialization.AddonInitializationModule), InitializationDependencyPosition.Before)] public class ConstraintResolverInitializer : IInitializableModule { public void Initialize(InitializationEngine context) { var serviceLocator = context.Locate.Advanced; serviceLocator.AddSingleton<IInlineConstraintResolver, CustomInlineConstraintResolver>(); } public void Uninitialize(InitializationEngine context) { // 无需额外清理操作 } }
3. 更新路由注册逻辑
修改RouteConfig.RegisterRoutes,从依赖注入容器获取预配置好的约束解析器,替代手动创建实例:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("authui/{*pathInfo}"); routes.IgnoreRoute("util/{*pathInfo}"); // 从DI获取已配置自定义约束的解析器 var constraintResolver = DependencyResolver.Current.GetService<IInlineConstraintResolver>(); routes.MapMvcAttributeRoutes(constraintResolver); }
调整后,TedGustaf插件初始化时会自动使用你预配置的CustomInlineConstraintResolver,其中已包含所需的路由约束,即可解决解析错误。
内容的提问来源于stack exchange,提问作者Hannes Carleson
相关产品推荐
相关产品推荐

