从 Owin Startup.Configuration 中删除 Global.asax 和 运行 EPiServer CMS MVC

Remove Global.asax and Run EPiServer CMS MVC from Owin Startup.Configuration

我需要编写一些自定义中间件才能与 EPiServer CMS 一起使用。我想从 StartUp.Configuration()

中删除 Application_Start() 和 运行 所有内容

这对于基线 MVC 4 应用程序似乎是可行的,因为您可以通过调用 Configuration() 中的方法来注册路由并执行所有必要的启动任务。

但是,EPiServer 的注册路由等方法受到保护(我不知道所有必要的方法)。我预计通过 运行 使用 Startup 而不是 [=] 启动应用程序会带来以下好处38=]

  1. 如果我可以控制何时初始化模块 运行,那么我可以在我的自定义中间件中使用服务定位器 (ServiceLocator)
  2. 我通过不为同一个应用程序设置两个应用程序起点来降低复杂性

    这些对我来说都很重要。除非绝对必要,否则我宁愿不使用 Application_Start()。

    我的研究揭示了使用 EPiServer.ServiceAPi 执行此操作的一种潜在方法 - 但 ServiceApi 的核心目的不会在我的应用程序中使用。纯粹为了 OWIN 兼容性而引入它似乎很浪费。它还具有 OAuth 提供程序依赖项,我此时不希望填写它,因为我的应用程序不需要它。有没有人成功地做到了这一点?任何人都可以提供指导吗?感谢您抽出宝贵时间,我很乐意在必要时对我的问题进行澄清。谢谢

    以下是代码片段: 请注意第一个上的名称空间 - 似乎继承了一些功能然后 运行 典型的 ASP.NET MVC 东西。

    public class EPiServerApplication : EPiServer.Global
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();            
            var formatters = GlobalConfiguration.Configuration.Formatters;
            var jsonFormatter = formatters.JsonFormatter;
            var settings = jsonFormatter.SerializerSettings;
            settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            GlobalConfiguration.Configuration.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );            
        }
    }
    

这里是典型的 OWIN 启动配置。我想删除上面的内容,只使用下面的内容。可以吗?

public class Startup
{                 
    public void Configuration(IAppBuilder app)
    {
        AreaRegistration.RegisterAllAreas();
        new EPiServer.ServiceApi.Startup().Configuration(app);
        app.Use(typeof(CustomMiddleware));
    }
}

我建议查看 InitializableModule 在 Episerver 启动时 运行 的事情:

[InitializableModule]
[ModuleDependency((typeof(EPiServer.Web.InitializationModule)))]
public class MyInitializationModule : IInitializableModule
{
    public void Initialize(InitializationEngine context)
    {
       // Your code here
    }
    public void Uninitialize(InitializationEngine context)
    {
    }
}

ModuleDependency 属性用于指定在执行您的代码之前必须加载另一个初始化模块。例如,对 EPiServer.Web.InitializationModule 的依赖可确保您可以调用 Episerver API 来处理代码中的内容。