2012-02-28 11 views
7

के लिए कस्टम एप्लिकेशन_स्टार्ट कोड मैंने पढ़ा है कि आवेदन स्टार्टअप पर अपना कोड चलाने के लिए umbraco के लिए मुझे umbraco.Global से उत्तराधिकारी होना चाहिए और Application_Start को ओवरराइड करना होगा। मैंने निम्नलिखित सरल कोड के साथ ऐसा किया है जो umbraco वेब साइट प्रोजेक्ट द्वारा संदर्भित अपनी स्वयं की असेंबली में रहता है, और इसके बिन फ़ोल्डर में।umbraco वेबसाइट

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" बिन निर्देशिका में मौजूद नहीं है।

मैं भी 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) है।

+0

क्या आपको इसका समाधान मिला? – Digbyswift

+0

दुर्भाग्य से, –

उत्तर

0

यदि आप आवेदन शुरू करने के लिए कोड शुरू करना चाहते हैं, तो आप जिस तरह से सामान्य रूप से ऐसा करेंगे, वह एप्लिकेशन क्लास से प्राप्त होने वाली कक्षा बनाना है। जब से उम्ब्राको आवेदन शुरू होता है तब से प्राप्त होने वाले सार्वजनिक वर्गों को बुलाया जाता है।

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 
     } 
    } 
} 
+2

मैंने इसे चिह्नित नहीं किया है क्योंकि स्टार्ट-अप पर चलाने के लिए कोड जोड़ने का यह सही तरीका नहीं है। इस प्रकार आप उम्ब्राको घटनाओं का विस्तार करेंगे, उदाहरण के लिए एक नोड को स्थानांतरित या कॉपी करना। यदि आप इसमें लॉगिंग जोड़ते हैं, तो आप देखेंगे कि यह वास्तव में एप्लिकेशन जीवनकाल में कई बार तत्काल हो सकता है। – Digbyswift

+1

एफडब्ल्यूआईडब्ल्यू मैंने मैट ब्रिलफोर्ड ब्लॉग पोस्ट में इसे पढ़ने के बाद भी इस विधि को आजमाया है। –

+0

@Digbyswift लेकिन अगर आपको उन चीजों को चलाने की ज़रूरत है जो umbraco कोर पर निर्भर हैं तो आप इसका उपयोग कर सकते हैं। एप्लिकेशन_स्टार्ट में इसे चलाने से आपको कैश्ड एक्सएमएल दस्तावेज़ में नोड्स तक पहुंच नहीं मिलती है। तो IAplicationStartupHandler –

2

अपनी खुद की Global.asax को लागू करने का सही तरीका के रूप में यह आवेदन प्रारंभ पर चलेंगे है: यहाँ स्टार्टअप घटनाओं है कि हम अपने Umbraco साइटों में से एक पर उपयोग में से एक से कुछ उदाहरण कोड है।

मैंने अपने ग्लोबल.एक्सएक्स को आपके समान तरीके से कार्यान्वित किया है, हालांकि मैं कोड को एक अलग परियोजना में एक अलग सीएस फ़ाइल में डालता हूं - लेकिन फिर यह मेरा तरीका है।

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 जोड़ने के लिए की आवश्यकता होगी।

व्यक्तिगत रूप से, मैं हमेशा अपनी global.cs फ़ाइल में लॉगिंग (लॉग 4नेट का उपयोग करके) जोड़ता हूं ताकि मैं सुनिश्चित कर सकूं कि मेरा लॉगिंग चालू है और चल रहा है और एप्लिकेशन पुनरारंभ हो गया है।

यदि आपका कोड नहीं उठाया जा रहा है, तो आप एप्लिकेशन को पुनरारंभ करने के लिए web.config में संशोधन करने का प्रयास करना चाहेंगे, लेकिन यह सुनिश्चित करने के लिए कि आपका कोड बस कुछ के लिए नहीं पहुंचा जा रहा है, डीबगर के साथ भी कदम उठाएं कोई और वजह।

+0

धन्यवाद के परिचय से पहले साइटों के लिए यह एक अच्छी विधि है। मैं अपने परमाणु एफ 1 ग्लोबल क्लास में बिल्कुल अपनी विधि का उपयोग कर रहा हूं लेकिन इसे अभी निकाल दिया नहीं जा रहा है। मैंने web.config को छूने और ऐप पूल को पुनरारंभ करने का प्रयास किया है। मुझे नहीं पता कि क्यों, क्योंकि मैंने जो कुछ भी पढ़ा है, वह मैंने शुरुआती रूप से कोशिश की है (और आपका समाधान) जाने का रास्ता है। –

1

मैं WebActivator पैकेज का उपयोग करूंगा। फिर आप ग्लोबल.एक्सएक्स और उम्ब्राको विधियों को ओवरराइड करने के बिना परेशान किए बिना अपना कोड चला सकते हैं।

त्वरित शुरुआत के लिए this blog post by Bart Wullems देखें।

+0

कि वेबएक्टिवेटर लिंक मृत हो गया। मुझे लगता है कि यह अब यहां बैठता है https://www.nuget.org/packages/WebActivatorEx/ – Sharky

4

मैंने विजुअल स्टूडियो में एक खाली एमवीसी समाधान बनाया और उम्ब्राको 6.x जोड़ा। संपादित global.asax.cs और आपके जैसा ही समस्या थी: कार्य नहीं फायरिंग।

समाधान आसान लगता है, लेकिन थोड़ा मुश्किल:

Global.asax फ़ाइल में (यदि आप दोगुना इसे क्लिक करें, दृश्य स्टूडियो Global.asax खोलता है।सीएस, "एफ 7" दबाएं या ग्लोबल.एक्सएक्स पर राइट क्लिक करें और "मार्कअप देखें" का चयन करें) आपको "इनहेरिट्स" विशेषता को बदलना होगा। 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#" %> 

यह भी देखें:

मूल custom controller documentation Umbraco से।

इसी तरह का प्रश्न (umbraco 6 को संबोधित): solution in stackoverflow

1

मुझे सराहना है कि यह एक बहुत पुराना सवाल है, लेकिन यह एक ही मुद्दे पर खोज करते समय मुझे मिले कुछ विकल्पों में से एक है।

जो समाधान मैंने तय किया है, इस धागे में उल्लिखित लोगों से अलग है, इसलिए मैंने सोचा कि मैं इसे भी पेश करूँगा।

मैं आगे बढ़ गया और एक कस्टमवेब मॉड्यूल लिखा जो वेब अनुरोध और umbraco में आने वाले किसी भी अनुरोध के बीच बैठ सकता है।

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

:

चरण एक एक कस्टम 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 कोर codebase यहाँ में सूचीबद्ध हैं था फिर web.config

<system.web> 
    <httpModules> 
     <add name="CustomWebModule" type="My.Application.Namespace.CustomWebModule"/> 
पर कुंजी जोड़ें 10

और

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

किंडा कठोर, लेकिन मुझे यह पसंद है – Sharky

संबंधित मुद्दे