2010-03-16 28 views
33

Tôi muốn sử dụng netTcpBinding cho ứng dụng WCF của tôi hiện đang được lưu trữ trong IIS7, có nghĩa là cấu hình nó để sử dụng WAS. Tuy nhiên, ứng dụng của tôi trước đây đã sử dụng sự kiện Application_Start trong tệp global.asax. Tôi không yêu cầu truy cập vào httpContext (mà tôi hiểu quyền truy cập đã được gỡ bỏ trong IIS7), tuy nhiên tôi vẫn muốn móc vào các phương thức start hoặc init?tương đương Global.asax Application_Start khi sử dụng WS trong IIS7

Tương đương tồn tại khi lưu trữ một ứng dụng trong WAS như được ứng dụng cho IIS7?

Sử dụng chế độ cổ điển không phải là tùy chọn (một lần nữa tôi không quan tâm đến httpcontext và điều này chỉ hoạt động nếu sử dụng http binding) - và tôi đã xem ví dụ về cách đặt lớp tĩnh instide thư mục app_code trông giống như một vụ hack khủng khiếp.

Trả lời

27

Tôi tin rằng AppInitialize() là phương pháp bạn đang tìm kiếm. Dưới đây là một bài báo về việc sử dụng nó để khởi Lâu đài Windsor trong một dịch vụ WCF được tổ chức:

Castle Windsor and non-HTTP Protocol WCF Services

Bản chất của bài viết là, thay vì sử dụng Application_Start() mà sẽ không được gọi trong WS:

protected void Application_Start(object sender, EventArgs e) 
{ 
    var container = new WindsorContainer("ioc.config"); 
    DefaultServiceHostFactory.RegisterContainer(container.Kernel); 
} 

Sử dụng:

public class InitialiseService 
{ 
    /// <summary> 
    /// Application initialisation method where we register our IOC container. 
    /// </summary> 
    public static void AppInitialize() 
    { 
     var container = new WindsorContainer("ioc.config"); 
     DefaultServiceHostFactory.RegisterContainer(container.Kernel); 
    } 
} 

Để báo Matt:

tôi thú nhận tôi đã dành một thời gian nhìn vào máy chủ cụ thể hơn, tìm cách để quấn DefaultServiceHostFactory. Tuy nhiên, có vẻ như là một giải pháp đơn giản hơn nhiều và đó là sử dụng phương thức AppInitialize được tài liệu ít . Nếu bạn tạo một lớp (bất kỳ lớp nào), đặt nó vào thư mục ASP.NET App_Code trong dự án của bạn và cho nó một chữ ký phương thức như được định nghĩa bên dưới, em bé này sẽ bị sa thải chính xác khi bạn muốn. Sau đó, bạn có thể khởi tạo container IoC trong đó.

+0

Cảm ơn bạn đã tôn trọng. Tôi đã đi qua đó, nhưng có vẻ khá "hacky" để đặt nó nhẹ ... Tôi thực sự không nghĩ rằng tôi sẽ phải dựa vào thư mục app_code .... là có thực sự không thay thế phù hợp khác? –

+0

Nhưng dường như nó bị bỏ qua bởi VS Web Server (còn gọi là Casini, ASP.NET Dev Server) – abatishchev

+0

@abatishchev - Còn với IIS Express thì sao? – Kev

13

AppInitialize là phương pháp hợp lệ để khởi tạo dịch vụ của bạn. Nhưng có một số phương pháp khác có thể hoạt động tốt hơn cho bạn và chúng được mô tả trong bài viết này: How to Initialize Hosted WCF Services

+0

Cảm ơn Graham - Tôi đã không có cơ hội để xem đoạn mã này để xác nhận nó, nhưng bài viết trông giống như một lựa chọn tốt hơn là phải dựa vào các giải pháp hacky khác. –

+0

Application_Start chạy một ứng dụng cho toàn bộ ứng dụng. Sử dụng một nhà máy dịch vụ như đề cập liên kết của bạn sẽ chạy một lần cho mỗi dịch vụ, vì vậy bạn sẽ cần thêm logic để ngăn mã của bạn chạy hai lần. –

Các vấn đề liên quan