2012-02-28 8 views
7

Tôi đọc rằng để umbraco chạy mã của tôi khi khởi động ứng dụng, tôi cần phải kế thừa từ umbraco.Global và ghi đè Application_Start. Tôi đã làm điều đó với mã đơn giản sau đây nằm trong hội đồng riêng của nó được tham chiếu bởi dự án trang web umbraco, và trong thư mục bin của nó.mã application_start tùy chỉnh cho trang web 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"); 
    } 
} 

Trường hợp ngoại lệ là hoàn toàn chứng minh với tôi rằng nó không được gọi.

Theo như tôi biết tất cả những gì tôi cần làm là những gì tôi đã làm. Tôi không cần phải cập nhật một bảng umbraco bất cứ nơi nào (như là trường hợp khi thực hiện một số hiệu ứng khác nhau để umbraco).

Tuy nhiên, mã của tôi không bao giờ được gọi và tôi không thể tìm hiểu lý do. Tôi có cần đăng ký gì đó ở đâu đó không?

Tôi cũng đã kiểm tra để đảm bảo "App_Global.asax.dll" không có trong thư mục bin.

Tôi cũng đã cố gắng tạo ra một Global.asax trong dự án trang web umbraco trông như thế này:

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

Phiên bản umbraco là 4.7.1 (.NET 4.0).

+0

Bạn có tìm thấy giải pháp cho điều này không? – Digbyswift

+0

Thật không may, không có –

Trả lời

0

Nếu bạn muốn mã chạy trên ứng dụng khởi động, cách bạn thường làm là tạo một lớp kế thừa từ ApplicationBase. Các lớp công khai kế thừa từ này được gọi khi ứng dụng Umbraco khởi động. Dưới đây là một số mã ví dụ từ một trong những sự kiện khởi động mà chúng tôi sử dụng trên một trong các trang web của chúng tôi 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 
     } 
    } 
} 
+2

Tôi đã đánh dấu trang này vì đây không phải là cách chính xác để thêm mã để chạy khi khởi động. Đây là cách bạn sẽ mở rộng các sự kiện Umbraco, ví dụ: Di chuyển hoặc sao chép một nút. Nếu bạn thêm đăng nhập vào điều này, bạn sẽ thấy rằng điều này thực sự có thể được khởi tạo nhiều lần trong vòng đời của ứng dụng. – Digbyswift

+1

FWIW Tôi cũng đã thử phương pháp này, sau khi đọc nó trong một bài đăng trên blog Matt Brailsford. –

+0

@Digbyswift Nhưng nếu bạn cần chạy những thứ phụ thuộc vào lõi umbraco, bạn có thể sử dụng nó. Chạy nó trong Application_Start sẽ không cung cấp cho bạn quyền truy cập vào các nút trong tài liệu xml đã lưu trong bộ nhớ cache. Vì vậy, đây là một phương pháp tốt cho các trang web trước khi giới thiệu các IApplicationStartupHandler –

2

Thực hiện global.asax của riêng bạn là cách đúng vì nó sẽ chạy khi khởi động ứng dụng.

Tôi đã triển khai global.asax theo cách tương tự như của bạn, tuy nhiên tôi đặt mã trong một tệp CS riêng biệt trong một dự án riêng biệt - nhưng đó chỉ là cách của tôi.

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"); 
    } 

} 

Nhìn vào sự khác biệt, bạn cần thêm protected override vào phương pháp của mình.

Cá nhân, tôi luôn thêm nhật ký (bằng cách sử dụng log4net) vào tệp global.cs của mình để tôi có thể đảm bảo rằng nhật ký của tôi đã được thiết lập và đang chạy và ứng dụng đã khởi động lại.

Nếu mã của bạn không được chọn, bạn có thể muốn sửa đổi web.config để buộc ứng dụng khởi động lại, nhưng cũng phải thực hiện bước gỡ rối để đảm bảo rằng mã của bạn không đạt được đối với một số Lý do khác.

+0

Cảm ơn. Tôi đang sử dụng chính xác phương pháp của bạn trong lớp AtomicF1Global của tôi nhưng nó chỉ không bị sa thải. Tôi đã thử chạm vào web.config và khởi động lại nhóm ứng dụng, v.v. Tôi không biết tại sao, bởi vì mọi thứ tôi đã đọc chỉ vào những gì tôi đã thử ban đầu (và cả giải pháp của bạn) như là cách để đi. –

1

Tôi sẽ sử dụng gói WebActivator. Sau đó, bạn có thể làm cho mã của bạn chạy mà không làm phiền với global.asax và ghi đè các phương thức Umbraco.

Xem this blog post by Bart Wullems để bắt đầu nhanh.

+0

liên kết WebActivator đó đã chết. tôi nghĩ rằng nó ngồi ở đây bây giờ https://www.nuget.org/packages/WebActivatorEx/ – Sharky

4

Tôi đã tạo một giải pháp MVC trống trong Visual Studio và thêm Umbraco 6.x. Đã chỉnh sửa global.asax.cs và có cùng vấn đề với bạn: chức năng không kích hoạt.

Các giải pháp có vẻ dễ dàng nhưng một chút khôn lanh:

trong file Global.asax (nếu bạn click đúp vào nó, visual studio mở global.asax.cs, nhấn "F7" hoặc nhấp chuột phải vào global.asax và chọn "View Markup"), bạn phải thay đổi thuộc tính "Inherits". Xem global.asax gốc từ umbraco:

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

Thay đổi nó như thế này:

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

Lưu ý: nếu YourGlobalClassName là bên trong một không gian tên, hãy chắc chắn để bao gồm các không gian tên là tốt, như thế này:

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

Xem thêm:

gốc custom controller documentation từ umbraco.

Câu hỏi tương tự (gửi đến umbraco 6): solution in stackoverflow.

1

Tôi đánh giá cao đây là câu hỏi rất cũ, nhưng đây là một trong số ít các tùy chọn tôi tìm thấy khi tìm kiếm một vấn đề tương tự.

Giải pháp tôi đã giải quyết khác với giải pháp được đề cập trong chuỗi này vì vậy tôi nghĩ tôi cũng sẽ cung cấp.

Tôi đã tiếp tục và đã viết một CustomWebModule có thể ngồi giữa yêu cầu web và mọi yêu cầu gửi đến umbraco.

Bước một là viết một tùy chỉnh IHttpModule thực hiện

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; 
     } 
    } 
} 

lưu ý rằng các cuộc gọi yêu cầu trong phần "công cụ ưa thích" được liệt kê trong lõi Umbraco codebase đây:

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

sau đó thêm các khóa vào 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

Kinda khắc nghiệt, nhưng tôi thích nó – Sharky