2009-03-22 36 views
9

Trong một ứng dụng demo nhỏ mà tôi đang xây dựng, tôi đặt mã để khởi tạo cơ sở dữ liệu trong sự kiện Global.Session_Start(). Tuy nhiên, tôi nhận thấy rằng sự kiện này không kích hoạt khi tôi chạy qua ứng dụng trong trình gỡ rối trên máy chủ phát triển (chưa thử nghiệm ở bất kỳ nơi nào khác).Điều gì thực sự khiến Session_Start được gọi?

Câu hỏi 1: Điều gì mang lại? Khi nào Session_Start() thực sự được gọi? Tôi cho rằng đó là khi phiên bắt đầu nhưng không nên bắt đầu mỗi chuỗi yêu cầu mới gây ra một phiên bắt đầu tự động? Chắc chắn một phiên nên bắt đầu bất cứ khi nào tôi chạy với F5 vậy tại sao không.

Câu hỏi 2: Có nơi nào tốt hơn để mã khởi tạo cơ sở dữ liệu không? tôi không muốn đặt nó trong phương thức Application_Start, vì nó không phải lúc nào cũng được gọi khi gỡ lỗi.

PS. Bởi khởi tạo cơ sở dữ liệu tôi không có nghĩa là tôi mở một kết nối đến SqlServer và để nó mở mãi mãi. Tôi đang sử dụng db4o và tôi mở một tệp cơ sở dữ liệu dựng sẵn. Như tôi đã nói đây chỉ là một ứng dụng demo, tôi không lo lắng về việc quản lý tài nguyên kém hay bất cứ thứ gì như thế.

+0

Bạn có thể xây dựng trên "khởi tạo cơ sở dữ liệu" không? – HardCode

+0

Được xây dựng. Tôi về cơ bản nói với Db4o sử dụng một tập tin cụ thể để vẽ dữ liệu –

+0

Tình cờ đăng hai lần. Đã xóa một cái khác, cái này có nhiều thông tin hơn. –

Trả lời

3

Tôi không hoàn toàn chắc chắn rằng phiên "bắt đầu" cho đến khi bạn truy cập đối tượng Phiên. Nếu không nó sẽ có vẻ như chi phí không cần thiết để cháy lên một phiên không cần thiết.

+0

Hmm..ok. Có lẽ nó sẽ có ý nghĩa để đặt mã trong BeginRequest() nhưng có cách nào để đặt một xử lý tại EndRequest() mà tôi có thể đóng tập tin cơ sở dữ liệu? –

+0

Tôi có thể không hoàn toàn đúng về điều này ... về điều tôi thấy trực tuyến là nó có thể là một vấn đề cấu hình asp.net có thể được giải quyết bằng "aspnet_regiis.exe -i". Tôi sẽ thử điều đó trước! – Keltex

1

Bạn sử dụng Mô hình phiên nào? Trong trường hợp các phiên được SQL Server hỗ trợ, nó có thể không bắt đầu một phiên mới. Trong trường hợp của InProc, tôi nghĩ rằng nó sẽ làm việc. Application_Start có vấn đề đôi khi được kích hoạt trước khi trình gỡ lỗi có thể đính kèm, như bạn đã chỉ ra.

Bạn có sử dụng IIS hoặc Máy chủ web phát triển không? Trong trường hợp của IIS, this article đề nghị bạn cần tạo nó như một ứng dụng trước tiên.

+0

Đó là máy chủ web phát triển. Như tôi đã nói ở trên, tôi không lo lắng về việc quản lý phiên cơ sở dữ liệu thích hợp. Đây là một ứng dụng demo và tôi đang sử dụng Db4o anyways. Tôi chỉ muốn chắc chắn rằng nó được mở ra trước khi bất cứ ai cố gắng sử dụng nó. –

+0

Tôi đã thêm vào web.config của mình. Session_Start() vẫn không kích hoạt –

2

Hmm..ok. Có lẽ nó sẽ có ý nghĩa để đặt mã trong BeginRequest() nhưng là có cách nào để đặt trình xử lý tại EndRequest() tại đó tôi có thể đóng tệp cơ sở dữ liệu ?

Vấn đề là bạn không bao giờ có thể dựa vào những sự kiện này để kích hoạt, vì thời gian chạy ASP.NET quyết định xem chúng có bị sa thải hay không, vì chúng có thể không cần thiết và có thể bỏ qua để tiết kiệm tài nguyên. Ví dụ, một Response.Redirect hủy toàn bộ quá trình xử lý yêu cầu bằng cách sử dụng ThreadAbortException, và các sự kiện vòng đời trang/điều khiển sau đó sẽ không được kích hoạt, đó là lý do tại sao ví dụ không có End_Request hoặc một cái gì đó tương tự .

Tôi sẽ xem xét chuyển logic của bạn sang một lớp khác (độc lập với ASP.NET) và có thể khởi tạo cơ sở dữ liệu khi nó thực sự được yêu cầu từ một trang? Sau đó, bạn có thể đóng tệp cơ sở dữ liệu trong cùng một phương thức mà bạn cần thông tin, điều này sẽ làm cho bạn độc lập hơn nhiều so với trạng thái mà ứng dụng/phiên đang ở.

Không chắc chắn đây có phải là thông tin bạn đang tìm kiếm hay không :)

+0

Vâng, đó là một khuyến nghị hữu ích. Điều gì về câu hỏi 1. Khi trên thế giới là session_start thực sự phải bắn? –

+0

Hi George, Tôi không chắc chắn, nhưng tôi đoán "Keltex" đang đi đúng hướng, và nó bị đuổi khi bạn truy cập (viết?) Đến phiên từ bên ngoài trình xử lý Session_Start (ở đâu đó trong phương thức Page_Load ví dụ). –

6

tôi biết đây là một bài cũ nhưng có lẽ điều này sẽ giúp ai đó:

các session_start không cháy, trừ khi bạn đang thực sự đọc hoặc bằng văn bản cho đối tượng session.

Nếu bạn muốn sử dụng các sự kiện session_start nhưng không cần phải sử dụng các cửa hàng phiên ở tất cả, bạn có thể thêm dòng sau vào chỉ thị trang của trang đích của bạn:

<%@ Page EnableSessionState="ReadOnly" %> 

Điều này sẽ gây ra event_start để kích hoạt mà không cần phải lưu trữ bất cứ thứ gì trong đối tượng session.

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