2009-05-19 31 views
75

Tôi muốn có một trang ASP.NET MVC rất nhẹ bao gồm việc loại bỏ càng nhiều HttpModules thông thường càng tốt và vô hiệu hóa trạng thái phiên. Tuy nhiên khi tôi cố gắng để làm điều này, tôi nhận được lỗi sau:Làm cách nào để tắt trạng thái phiên trong ASP.NET MVC?

The SessionStateTempDataProvider requires SessionState to be enabled.

Tôi đã trạng thái phiên khuyết tật trong web.config:

<sessionState mode="Off" /> 

Tôi hiểu rằng ASP.NET MVC sử dụng phiên nhà nước cho TempData, nhưng tôi không cần/muốn TempData - Tôi chỉ muốn vô hiệu hóa trạng thái phiên. Cứu giúp!

+0

Ý tưởng hay - Tôi rất muốn nghe nếu bạn gặp phải bất kỳ sự cố nào khác với vấn đề này và mức độ nhẹ mà bạn có thể nhận được cuối cùng. –

+0

Tôi đã không làm nhiều thử nghiệm hơn sau khi tôi thực hiện các thay đổi của Steve, nhưng vẫn còn một số tiền hợp lý của chi phí. Nhanh nhất tôi đã có thể nhận được ASP.NET đi đã được triển khai IHttpHandler thẳng. Xem câu trả lời của tôi ở đây để biết thêm thông tin: http://stackoverflow.com/questions/509978/something-faster-than-httphandlers/510001#510001 –

+26

Điều này được khắc phục trong MVC 2. Chúng tôi đã sửa nhà cung cấp dữ liệu trạng thái phiên mà nó đã giành được không ném trừ khi bạn thực sự cố đọc/ghi dữ liệu tạm thời. –

Trả lời

47

Bạn có thể tạo ControllerFactory và DummyTempDataProvider của riêng mình. Một cái gì đó như thế này:

public class NoSessionControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(Type controllerType) 
    { 
    var controller = base.GetControllerInstance(controllerType); 
    ((Controller) controller).TempDataProvider = new DummyTempDataProvider(); 
    return controller; 
    } 
} 


public class DummyTempDataProvider : ITempDataProvider 
{ 
    public IDictionary<string, object> LoadTempData(ControllerContext controllerContext) 
    { 
    return new Dictionary<string, object>(); 
    } 

    public void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values) 
    { 
    } 
} 

Và sau đó bạn chỉ cần đăng ký nhà máy điều khiển khi khởi động ứng dụng - ví dụ: bạn có thể làm điều này trong global.asax:

ControllerBuilder.Current.SetControllerFactory(new NoSessionControllerFactory()); 
+1

Cảm ơn ... vẫn không lý tưởng (với tôi ít nhất), nhưng vẫn tốt hơn làm điều đó trên mỗi bộ điều khiển. –

+10

Xin lỗi, điều đó nghe có vẻ vô ơn ... không có nghĩa là: D –

+2

hehe, không sao cả :) Tôi hiểu nó có vẻ giống mã hơn bạn muốn cho những gì có vẻ như nó phải là một thứ có thể cấu hình , nhưng một trong những thế mạnh lớn của ASP.NET MVC là loại cấu hình này thông qua việc cung cấp các triển khai thay thế thông qua mã.Nó cung cấp cho bạn rất nhiều sức mạnh để có được trong đó và làm những việc theo cách bạn muốn và nói chung tôi muốn nói nó thực sự là một 'điều tốt'. Cá nhân tôi thích gõ mã C# hơn xml anyway;) –

9

Tôi đã tìm thấy một con đường, mà tôi không đặc biệt quan tâm đến:

Tạo NoTempDataProvider

using System; 
using System.Collections.Generic; 
using System.Web.Mvc; 

namespace Facebook.Sites.Desktop.Auth.Models 
{ 
    public class NoTempDataProvider : ITempDataProvider 
    { 
     #region [ ITempDataProvider Members ] 

     public IDictionary<String, Object> LoadTempData(ControllerContext controllerContext) 
     { 
      return new Dictionary<String, Object>(); 
     } 

     public void SaveTempData(ControllerContext controllerContext, IDictionary<String, Object> values) { } 

     #endregion 
    } 
} 

Manually Ghi đè lên các nhà cung cấp trong điều khiển

public class AuthController : Controller 
{ 
    public AuthController() 
    { 
     this.TempDataProvider = new NoTempDataProvider(); 
    } 
} 

Tôi rất muốn một cách để làm điều này hoàn toàn thông qua cấu hình, nhưng điều này hoạt động ngay bây giờ.

+3

Có, cách của bạn tương tự như cách tôi đã nêu trong câu trả lời của tôi - mặc dù bạn không phải tự ghi đè TempDataProvider trong mỗi bộ điều khiển nếu bạn cung cấp một ControllerFactory tùy chỉnh để xử lý nó cho bạn. –

+4

Bạn cũng có thể tạo một lớp Controller cơ sở và cấu hình TempDataProvider trong hàm khởi tạo của nó. – Brannon

1

Theo Brad Wilson, điều này đã được sửa trong bản xem trước MVC 2 1. Xem herehere.

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