2009-03-22 18 views
9

W małej aplikacji demo, którą buduję, umieszczam kod inicjujący bazę danych w zdarzeniu Global.Session_Start(). Jednak zauważam, że to zdarzenie nie uruchamia się, gdy korzystam z aplikacji w debugerze na serwerze programistycznym (jeszcze tego nie testowałem nigdzie indziej).Co właściwie powoduje wywołanie Session_Start?

Pytanie 1: Co daje? Kiedy wywoływana jest funkcja Session_Start()? Zakładam, że jest tak, gdy rozpoczyna się sesja, ale czy początek każdej nowej sekwencji żądań nie powinien rozpocząć się automatycznie? Z pewnością sesja powinna się rozpocząć za każdym razem, gdy uruchomię F5, więc dlaczego tak się nie dzieje.

Pytanie 2: Czy istnieje lepsze miejsce, w którym powinien zostać uruchomiony kod inicjujący bazę danych? wolałbym nie umieszczać go w metodzie Application_Start, ponieważ nie zawsze jest wywoływany podczas debugowania.

PS. Przez zainicjowanie bazy danych nie mam na myśli otwarcia połączenia z SqlServer i pozostawienia go na zawsze. Używam db4o i otwieram wstępnie zbudowany plik bazy danych. Jak już mówiłem, to tylko aplikacja demo, nie martwię się złym zarządzaniem zasobami ani nic takiego.

+0

Czy mógłby Pan rozwinąć temat "inicjowania bazy danych"? – HardCode

+0

Opracowanie. Zasadniczo mówię Db4o, aby używał konkretnego pliku do rysowania danych. –

+0

Przypadkowe podwójne posty. Usunięto drugiego, ten ma więcej informacji. –

Odpowiedz

3

Nie jestem całkowicie pewien, że sesja "rozpoczyna się", dopóki nie uzyskasz dostępu do obiektu Session. W przeciwnym razie wydaje się niepotrzebnym kosztem odpalenia niepotrzebnej sesji.

+0

Hmm..ok. Może byłoby sens wstawić kod do BeginRequest(), ale czy istnieje sposób umieszczenia programu obsługi w EndRequest(), w którym mogę zamknąć plik bazy danych? –

+0

Mogę nie być całkowicie w porządku na tym ... na rzeczy, które widziałem w Internecie jest to, że może to być problem konfiguracyjny asp.net, który może być rozwiązany przez "aspnet_regiis.exe -i". Najpierw spróbowałbym tego! – Keltex

1

Z jakiego modelu sesji korzystasz? W przypadku sesji zabezpieczonych programu SQL Server może nie rozpocząć nowych sesji. W przypadku InProc, myślę, że to powinno działać. Aplikacja Application_Start ma problem z czasami wyzwalanymi przed dołączeniem debuggera, jak zauważyłeś.

Czy korzystasz z usług IIS lub serwera sieciowego? W przypadku IIS, this article sugerują, że najpierw trzeba go utworzyć jako aplikację.

+0

To serwer WWW dla programistów. Tak jak powiedziałem powyżej, nie martwię się o właściwe zarządzanie sesją bazy danych. To jest aplikacja demo i mimo to używam Db4o. Chcę tylko upewnić się, że zostanie otwarty, zanim ktokolwiek spróbuje go użyć. –

+0

Dodałem do mojego pliku web.config. Session_Start() nadal nie odpala –

2

Hmm..ok. Może miałoby sens, aby umieścić kod w BeginRequest(), ale jest istnieje sposób, aby umieścić handler na EndRequest(), w którym mogę zamknąć plik bazy danych ?

Kwestia jest taka, że ​​nigdy nie można polegać na tych wydarzeń na ogień, ponieważ runtime ASP.NET decyduje, czy są one opalane czy nie, bo nie może nawet być konieczna i może być pominięta, aby zaoszczędzić zasoby.

Na przykład Response.Redirect anuluje całe przetwarzanie żądania za pomocą wyjątku ThreadAbortException, a zdarzenia cyklu życia strony/kontroli po nim nie zostaną w ogóle uruchomione, dlatego na przykład nie ma End_Request lub czegoś podobnego .

Zastanowiłabym się, czy przenieść logikę do innej warstwy (niezależnie od ASP.NET), i może zainicjować bazę danych, gdy faktycznie jest żądana ze strony? Następnie możesz zamknąć plik bazy danych w taki sam sposób, w jaki potrzebowałeś informacji, co znacznie zwiększyłoby niezależność od stanu aplikacji/sesji.

Nie jesteś pewien, czy to informacja, której szukałeś :)

+0

Tak, to pomocne zalecenie. A co z pytaniem 1. Kiedy na świecie sesja_start ma się faktycznie wystrzelić? –

+0

Cześć George, Nie jestem pewien, ale zgaduję, że "Keltex" jest we właściwym kierunku i zostaje wyrzucony, kiedy uzyskujesz dostęp (zapisujesz?) Do sesji spoza Session_Start handler (gdzieś w metodzie Page_Load na przykład). –

6

wiem, że to stary post, ale może to pomoże ktoś:

session_start nie ognia, chyba że faktycznie odczytu lub zapisu do obiektu sesji.

Jeśli chcesz wykorzystać zdarzenie session_start ale nie muszą korzystać z magazynu sesji w ogóle, można dodać następujące dyrektywy page stron docelowych:

<%@ Page EnableSessionState="ReadOnly" %> 

To spowoduje Zdarzenie session_start jest uruchamiane bez konieczności zapisywania czegokolwiek w obiekcie sesji.