umbraco网站的自定义应用程序启动代码

本文关键字:启动 代码 应用程序 自定义 网站 umbraco | 更新日期: 2023-09-27 18:26:08

我读到,为了让umbraco在应用程序启动时运行我的代码,我需要从umbraco继承。全局并覆盖Application_Start。我已经用下面的简单代码完成了这项工作,这些代码位于umbraco网站项目引用的它自己的程序集中,以及它的bin文件夹中。

public class AtomicF1Global : umbraco.Global
{        
    protected override void Application_Start(object sender, EventArgs e)
    {
        base.Application_Start(sender, e);
        new WindsorStarter().Start();
        throw new Exception("Reached Custom Global");
    }
}

例外只是为了向我证明它没有被调用。

据我所知,我所需要做的就是我所做的。我不需要在任何地方更新umbraco表(对umbraco进行许多不同的修改时就是这样)。

然而,我的代码从未被调用过,我也无法找出原因。我需要在什么地方注册吗?

我还检查了一下以确保"App_Global.asax.dll"不在bin目录中。

我还尝试在umbraco站点项目中创建一个Global.asax,看起来像这样:

<%@ Application Language="C#" Inherits="umbraco.Global" %>
<%@ Import Namespace="atomicf1.domain" %>
<script runat="server">
    void Application_Start(object sender, EventArgs e) 
    {
        // Call Global base class first
        base.Application_Start(sender, e);

        // Code that runs on application startup
        new WindsorStarter().Start();
        throw new Exception("Reached Custom Global");
    }             
</script>

umbraco的版本为4.7.1(.NET 4.0)。

umbraco网站的自定义应用程序启动代码

我在Visual Studio中创建了一个空的MVC解决方案,并添加了Umbraco 6.x。编辑了global.asax.cs,遇到了与您相同的问题:函数未启动。

解决方案看起来很简单,但有点棘手:

在global.asax文件中(如果双击它,visual studio将打开global.asax.cs,按"F7"或右键单击global.asaz并选择"查看标记"),您必须更改"继承"属性。请参阅umbraco:的原始global.asax

<% Application Codebehind="Global.asax.cs" Inherits="Umbraco.Web.UmbracoApplication" Language="C#" %>

更改为:

<%@ Application Codebehind="Global.asax.cs" Inherits="YourGlobalClassName" Language="C#" %>

注意:如果YourGlobalClassName在Namespace内,请确保也包含命名空间,如下所示:

<%@ Application Codebehind="Global.asax.cs" Inherits="YourNameSpace.YourGlobalClassName" Language="C#" %>

另请参阅:

umbraco的原始自定义控制器文档。

类似的问题(针对umbraco 6):stackoverflow中的解决方案。

实现您自己的global.asax是正确的方式,因为它将在应用程序启动时运行。

我以与您类似的方式实现了我的global.asax,但我将代码放在一个单独项目中的一个单独的CS文件中,但这只是我的方式。

public class Global : umbraco.Global
{
    protected override void Application_Start(object sender, System.EventArgs e)
    {
        base.Application_Start(sender, e);
        XmlConfigurator.Configure();
        ILog log = LogManager.GetLogger(typeof (Global));
        log.Debug("Application started");
    }
}

考虑到差异,您需要将protected override添加到您的方法中。

就我个人而言,我总是将日志记录(使用log4net)添加到我的global.cs文件中,这样我就可以确保我的日志记录已经启动并运行,并且应用程序已经重新启动。

如果您的代码没有被提取,您可能需要尝试修改web.config以强制重新启动应用程序,但也可以使用调试器来确保您的代码不会因为其他原因而被访问。

如果您希望代码在应用程序启动时运行,通常的方法是创建一个从ApplicationBase继承的类。从中继承的公共类在Umbraco应用程序启动时被调用。以下是我们在Umbraco网站上使用的一个启动事件的示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using umbraco.BusinessLogic;
using umbraco.cms.businesslogic.web;
using umbraco.BasePages;
namespace MySite.Events
{
    public class EventHandlers : ApplicationBase
    {
        public EventHandlers()
        {
            //put your code to run on app startup here
        }
    }
}

我会使用WebActivator包。然后,您就可以运行代码,而不必使用global.asax和重写Umbraco方法。

请参阅Bart Wullems的这篇博客文章,快速入门。

我理解这是一个非常古老的问题,但这是我在搜索类似问题时发现的为数不多的选项之一。

我确定的解决方案与本帖子中提到的不同,所以我想我也会提供它。

我继续写了一个CustomWebModule,它可以位于web请求和任何进入umbraco的请求之间。

第一步是编写一个自定义的IHttpModule实现

namespace My.Application.Namespace
{
    public class CustomWebModule : IHttpModule
    {
        static void AuthenticateRequest(object sender, EventArgs e){
            // DO ALL FANCY STUFF in my app and then make calls to the 
            // KEY umbraco functions from umbraco.core.security.AuthenticationExtensions 
            // "AuthenticateCurrentRequest" function.
            // 
            // specifically: setting the GenericPrincipal and related entities.
        }
        public void Dispose()
        {
            //throw new NotImplementedException();
            // make sure you don't write a memory leak!
            // dispose of everything that needs it!
        }
        public void Init(HttpApplication app)
        {
            app.AuthenticateRequest += AuthenticateRequest; 
        }
    }
}

请注意,在Umbraco核心代码库中列出了"花哨的东西"部分所需的调用:

https://github.com/umbraco/Umbraco-CMS/blob/dev-v7/src/Umbraco.Core/Security/AuthenticationExtensions.cs

然后将密钥添加到web.config

<system.web>
    <httpModules>
        <add name="CustomWebModule" type="My.Application.Namespace.CustomWebModule"/>

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
            <remove name="CustomWebModule"/>
            <add name="CustomWebModule" type="My.Application.Namespace.CustomWebModule"/>