Skoro MOSS/WSS jest aplikację Web napisaną w .NET, można by przypuszczać iż wywołanie:
HttpContext.Current.Session
Zwróci nam obiekt HttpSessionState. Nic bardziej mylnego. MOSS/WSS domyślnie ma wyłączoną obsługę sesji. Żeby włączyć obsługę sesji należy wykonać modyfikację Web.config od strony MOSS/WSS.
Pierwszym krokiem, jest odkomentowanie, następującej linijki:
<system.web> <!-- ... --> <httpModules> <!-- ... --> <!-- <add name="Session" type="System.Web.SessionState.SessionStateModule"/> --> <!-- ... --> </httpModules> <!-- ... --> </system.web>
Po odkomentowaniu, kod będzie wyglądał tak:
<system.web> <!-- ... --> <httpModules> <!-- ... --> <add name="Session" type="System.Web.SessionState.SessionStateModule"/> <!-- ... --> </httpModules> <!-- ... --> </system.web>
Drugim krokiem jest zmienienie linijki (pogrubieniem i większą czcionką zaznaczone jest co należy zmienić):
<system.web> <!-- ... --> <pages enableSessionState="false" enableViewState="true" enableViewStateMac="true" validateRequest="false" pageParserFilterType="Microsoft.SharePoint.ApplicationRuntime.SPPageParserFilter, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" asyncTimeout="7"> <!-- ... --> </pages> <!-- ... --> </system.web>
Na (pogrubieniem i większą czcionką zaznaczone jest na co należy zmienić – enableSessionState na true):
<system.web> <!-- ... --> <pages enableSessionState="true" enableViewState="true" enableViewStateMac="true" validateRequest="false" pageParserFilterType="Microsoft.SharePoint.ApplicationRuntime.SPPageParserFilter, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" asyncTimeout="7"> <!-- ... --> </pages> <!-- ... --> </system.web>
Teraz wystarczy IISReset i możemy cieszyć się możliwością dostępu do obiektu HttpSessionState prosto z kodu.
Jeżeli posiadamy MOSS (nie sam WSS) i chcemy udostępnić sesję współdzieloną przez farmę, musimy wykonać następujące operację:
- Stworzyć SSP (Shared Service Provider) (jeżeli już jednego nie posiadamy) i powiązać z nim naszą Web Application;
- Otworzyć stronę Central Administration i przejść na zakładkę Application Management i w sekcji Office SharePoint Server Shared Service Provider kliknąć na Configure Session State;
- Na stronie Configure Session State, w sekcji Enable Session State należy zaznaczyć Enable Session State. Dodatkowo w sekcji Timeout możemy ustalić czas trwania sesji dla farmy;
- Kliknąć OK;
- Wykonać zmiany w Web.config opisane powyżej;
- Otworzyć okno poleceń i przejść do katalogu, w którym znajduje się .NET Framework 2.0 (przeważnie: %windir%Microsoft.NETFrameworkv2.0.50727);
- Wykonać następujące polecenie
aspnet_regsql –S <server_name> -d <database_name> -ssadd -sstype c -Egdzie:
- Server_name – nazwa serwera baz danych na którym znajduje się baza danych od MOSS (content database);
- Database_name – nazwa bazy danych od MOSS (kontent database).
- Wykonać IISReset.
Opis kroków 2-3 możecie znaleźć tutaj (Technet – Manage Session State).
Kroki opisane powyżej umożliwią nam korzystanie z obiektu sesji PRAWIE w każdej sytuacji. Jednym z wyjątków jest Event Receiver. Jednakże ten problem jest łatwo obejść… dla synchronicznych zdarzeń. Synchroniczne zdarzenia w skrócie to te, które kończą się nazwą na ing np.: ItemUpdating. Zdarzenia te, są wywoływane przez dodaniem/aktualizacją/usunięciem określonego elementu (czy to pola czy elementu z listy… po listę typów receiver, zapraszam na tę stronę).
By umożliwić naszemu Event Receiver na dostęp do sesji musimy dodać do niego konstruktor i zmienną prywatną:
/// <summary> /// Nasz obiekt HttpContext, który umożliwi nam dostęp do /// obiektu sesji. /// </summary> private HttpContext _context; /// <summary> /// Nasz własny konstruktor, który pobiera obiekt HttpContext /// w momencie, w którym jest on dostępny (czyli podczas tworzenia /// obiektu). /// </summary> public MyItemEventReceiver() { this._context = HttpContext.Current; } /// <summary> /// Zwraca aktualny kontekts. /// </summary> public HttpContext Context { get { return this._context; } }
Teraz np.: w metodzie ItemUpdating możemy wykonać następującą operację:
/// <summary> /// Przykład pobrania zmiennej sesyjnej. /// </summary> /// <param name="properties">Własności event receiver.</param> public override void ItemUpdating(SPItemEventProperties properties) { string myValue = Context.Session["MyKey"] as string; }
I to wszystko! :)
Zaznaczę jeszcze raz, obiekt sesji NIE JEST DOSTĘPNY z zdarzeń asynchronicznych!
Przy wykonywaniu polecenia “aspnet_regsql…” parametr -d oznacza bazę danych “Content Database” dla “Shared Service Provider-a”.
Comments are closed.