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)。
我在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"/>