пользовательский код application_start для сайта umbraco - PullRequest
7 голосов
/ 29 февраля 2012

Я прочитал, что для запуска моего кода 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).

Однако мой код никогда не вызывается, и я не смог выяснить, почему. Нужно ли что-то регистрировать?

Я также проверил, чтобы файл App_Global.asax.dll не присутствовал в каталоге bin.

Я также попытался создать Global.asax в проекте сайта umbraco, который выглядит следующим образом:

<%@ 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 ]

4 голосов
/ 17 июня 2013

Я создал пустое решение MVC в Visual Studio и добавил Umbraco 6.x.Отредактировал global.asax.cs и столкнулся с той же проблемой, что и вы: функция не запускается.

Решение кажется простым, но немного сложным:

В файле global.asax (если дважды щелкнутьэто, Visual Studio открывает global.asax.cs, нажмите «F7» или щелкните правой кнопкой мыши на global.asax и выберите «View Markup»), вам нужно изменить атрибут «Inherits».См. Исходный файл global.asax от umbraco:

<% 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.

Аналогичный вопрос (адресованный umbraco 6): решение в стеке потока .

2 голосов
/ 02 марта 2012

Реализация собственного 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, чтобы принудительно перезапустить приложение, но также отладчик, чтобы убедиться, что ваш код просто не доступен для других причина.

1 голос
/ 06 апреля 2015

Я ценю, что это очень старый вопрос, но это один из немногих вариантов, которые я нашел при поиске по похожей проблеме.

Решение, на котором я остановился, отличается от упомянутых в этом.я подумал, что тоже предложу.

Я продолжил и написал CustomWebModule, который может находиться между веб-запросом и любыми запросами, входящими в 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"/>
1 голос
/ 21 марта 2012

Я бы использовал пакет WebActivator . Затем вы можете запустить свой код, не беспокоясь о global.asax и переопределяя методы Umbraco.

См. это сообщение в блоге Барта Вуллемса для быстрого начала.

1 голос
/ 01 марта 2012

Если вы хотите, чтобы код запускался при запуске приложения, вы обычно делаете это, создавая класс, который наследуется от 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
        }
    }
}
...