umbraco网站的自定义application_start代码

时间:2012-02-28 23:12:51

标签: c# .net umbraco

我读到umbraco在应用程序启动时运行我的代码我需要从umbraco.Global继承并覆盖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进行一些不同的修改一样)。

但是,我的代码永远不会被调用,我也无法找到原因。我需要在某处注册某些内容吗?

我还检查过以确保bin目录中没有“App_Global.asax.dll”。

我还尝试在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)。

5 个答案:

答案 0 :(得分:4)

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

解决方案似乎很简单但有点棘手:

在global.asax文件中(如果双击它,visual studio打开global.asax.cs,按“F7”或右键单击global.asax并选择“查看标记”)你必须更改“继承” “属性。从umbraco看到原始的global.asax:

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

将其更改为:

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

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

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

另见:

来自umbraco的

原始custom controller documentation

类似的问题(发给umbraco 6):solution in stackoverflow

答案 1 :(得分:2)

实现自己的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以强制重新启动应用程序,但也要逐步调试调试器以确保您的代码没有被其他人访问原因。

答案 2 :(得分:1)

我会使用WebActivator包。然后,您可以在不使用global.asax和覆盖Umbraco方法的情况下运行代码。

请参阅this blog post by Bart Wullems以便快速入门。

答案 3 :(得分:1)

我很欣赏这是一个非常古老的问题,但这是我在搜索类似问题时发现的少数选项之一。

我已经解决的解决方案与此主题中提到的解决方案不同,所以我认为我也会提供它。

我继续编写了一个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"/>

答案 4 :(得分:0)

如果您希望代码在应用程序启动时运行,那么您通常采用的方法是创建一个继承自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
        }
    }
}