You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:02:45