2010-10-10 34 views
13

Tôi đang xây dựng ứng dụng ASP .NET cho nhiều người thuê. Cho rằng mỗi đối tượng thuê có thể cấu hình ứng dụng của họ động (có thể liên quan đến các hội đồng tùy chỉnh động được nạp vào bộ nhớ), tôi cần một phương tiện cô lập từng đối tượng thuê.Cách ly trong Ứng dụng ASP .NET Nhiều người thuê.

Tôi không muốn tạo Ứng dụng web mới cho mỗi người thuê vì lý do bảo trì.

Tôi đã cân nhắc việc sử dụng AppDomainManager để tạo AppDomain cho mỗi ứng dụng, nhưng có vẻ như điều này không có ý định được sử dụng cho các ứng dụng ASP .NET.

Có ai có một số đề xuất về chủ đề này không?

Cảm ơn.

Trả lời

5

Tôi đoán câu hỏi là: Nếu bạn không tạo ứng dụng web thì loại cách ly nào thực sự có thể chấp nhận được đối với bạn?

Nếu bạn thực sự muốn bảo đảm cấp hệ điều hành, các hội đồng sẽ không hỗ trợ lẫn nhau, tôi sẽ cung cấp cho mỗi Ứng dụng web của riêng họ. Điều này đặc biệt đúng nếu bạn cho phép mọi người tải các hội đồng của bên thứ ba và đặc biệt đúng nếu các hội đồng của bên thứ ba đó có thể tìm ra cách để khởi tạo mã không được quản lý.

Tôi có thể thấy không tạo ra một ứng dụng web riêng biệt nếu đó là tất cả (quản lý) mã của bạn, nhưng một khi bạn đặt cụm tùy chỉnh động vào hỗn hợp, tôi nghĩ rằng đó là cách duy nhất để đi.

+0

Tôi thứ hai, cụm từ khóa là "hội đồng tùy chỉnh". –

+0

Ok, tôi chắc chắn sẵn sàng xem xét điều đó, nhưng tôi có một vài lo ngại. Một - tất cả các ứng dụng nên có cùng một URL gốc ... điều này thậm chí có thể? Hai - việc tạo và xóa cần tự động ... tôi có nên sử dụng WMI cho điều đó không? Tôi không biết làm thế nào tôi cảm thấy về điều đó ... Và bao nhiêu webapps IIs hỗ trợ nào? Điều đó có quy mô trong một đám mây phần cứng, vì giới hạn sẽ là os? Ba - chúng tôi muốn giải pháp này được Azure tương thích (nhưng không Azure cụ thể), vì vậy làm thế nào tôi sẽ đi về việc quản lý nó cho Azure? – Jeff

+0

Ngoài ra, bạn sẽ đề xuất xử lý tài nguyên được chia sẻ (trang) như thế nào? Một VirtualPathProvider trích xuất trang từ các dll được chia sẻ? – Jeff

1

Khi bạn tạo các trang web khác nhau, gốc URL của bạn chắc chắn sẽ thay đổi. Tôi đã suy nghĩ tại sao không phải các ứng dụng khác nhau bên trong ứng dụng chính, và đặt chúng trong các Nhóm ứng dụng khác nhau nếu được yêu cầu?

Một ... Bằng cách đó, URL gốc sẽ vẫn giữ nguyên. Hai ... Tạo một VDir hoặc một thể hiện của một ứng dụng. Cái nào cần phải năng động? Ba ... Tôi không có chuyên môn.

Nếu tôi phải chia sẻ Trang, [dựa trên các ứng dụng được lưu trữ trong VDir khác nhau], tôi sẽ tạo một VDir mới cho tất cả các trang được chia sẻ của mình. Và sử dụng một số mã tùy chỉnh để hiển thị dữ liệu liên quan đến ứng dụng.

+0

Làm thế nào tôi sẽ tự động tạo các ứng dụng là câu hỏi? – Jeff

+0

Nếu bạn đang sử dụng IIS 7, bạn có thể sử dụng cấu hình đại biểu của Thư mục ảo IIS cho người dùng cuối để họ có thể định cấu hình ứng dụng của họ. –

+0

HOẶC, bạn có thể sử dụng SharePoint hoặc DotNetNuke. Nếu tôi hiểu câu hỏi của bạn một cách chính xác, bạn có thể sử dụng SharePoint để tạo một định nghĩa trang và có bất kỳ ai sử dụng nó làm mẫu cho các trang web của riêng họ. –

1

Tôi đã viết ứng dụng web nhiều bên thuê trong MVC2. Thêm/xóa một tài khoản phức tạp như việc thêm/xóa một hàng trong một bảng khi tôi đã chọn cơ sở dữ liệu được chia sẻ, phương pháp lược đồ được chia sẻ.

Đây là một bài viết rất tốt về thiết kế cơ sở dữ liệu đa người thuê nhà từ MSDN: Multi-Tenant Data Architecture

Tất cả tôi phải làm trong MVC là để thiết lập định tuyến đúng cách, vì vậy phần đầu tiên của con đường là tên tài khoản :

  • www.yourdomain.com/Account1/...
  • www.yourdomain.com/Account2/...
  • www.yourdomain.com/Account3/...

và tôi có một MvcHandler tùy chỉnh cho nhìn lên tài khoản cho mỗi yêu cầu:

public class AccountMvcHandler : MvcHandler 
{ 
    public AccountModel Account { get; set; } 

    public AccountMvcHandler(RequestContext requestContext) 
     : base(requestContext) 
    { 
    } 

    protected override IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object state) 
    { 
     string accountName = this.RequestContext.RouteData.GetRequiredString("account"); 
     Account = ServiceFactory.GetService<IAccountService>().GetAccount(accountName); 

     // URL doesn't contain valid account name - redirect to login page with Account Name textbox 
     if (Account == null) 
      httpContext.Response.Redirect(FormsAuthentication.LoginUrl); 

     return base.BeginProcessRequest(httpContext, callback, state); 
    } 
} 

Như người ta nói bởi Andreas Paulsson cụm từ quan trọng là "hội tùy chỉnh". Tại sao bạn cần 'hội đồng tùy chỉnh' để cấu hình?Bạn đang sử dụng CodeEmit? Người dùng có tải chúng lên không? Tôi thà suy nghĩ về việc sử dụng Windows Workflow Foundation cho bất kỳ tùy chỉnh logic nghiệp vụ cụ thể nào của khách hàng.

+0

Tôi thực sự có các tuyến đường MVC cụ thể dành cho người thuê nhà được thiết lập, điều này hoạt động rất tốt. Mục đích của hội đồng tùy chỉnh là người thuê nhà phải có khả năng tùy chỉnh "bản sao" của họ với các trang tùy chỉnh và mã đằng sau. Cô lập bất kỳ mã tùy chỉnh nào cho mục đích này là chìa khóa. – Jeff

+0

Để làm rõ thêm, có, người dùng sẽ tải lên các hội đồng tùy chỉnh, sẽ được biên dịch và chạy trong miền ứng dụng. Vấn đề là các hội đồng này cần một số hình thức cô lập để không thể truy cập dữ liệu từ những người thuê nhà khác. Tôi đã có mã tại chỗ ngăn các assembly tùy chỉnh thực hiện các cuộc gọi DB, nhưng tôi lo ngại về các ngữ cảnh tĩnh, chẳng hạn như trạng thái ứng dụng hoặc các thuộc tính/phương thức/các trường tĩnh. – Jeff

+0

Tôi đã xem xét việc tạo các miền ứng dụng động cho các hội đồng tùy chỉnh này, nhưng tôi muốn một cái gì đó được tích hợp, vì asp .net đã quản lý các miền ứng dụng cho tôi. Ngoài ra, tôi không chắc chắn làm thế nào tôi có được miền ứng dụng tùy chỉnh của tôi vào vòng đời yêu cầu asp .net (có thể phát hành các trang aspx được hiển thị) – Jeff

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