Dostęp do obiektu sesji z SharePoint

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ć):

<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ę:

1.       Stworzyć SSP (Shared Service Provider) (jeżeli już jednego nie posiadamy) i powiązać z nim naszą Web Application;

2.       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;

3.       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;

4.       Kliknąć OK;

5.       Wykonać zmiany w Web.config opisane powyżej;

6.       Otworzyć okno poleceń i przejść do katalogu, w którym znajduje się .NET Framework 2.0 (przeważnie: %windir%\Microsoft.NET\Framework\v2.0.50727);

7.       Wykonać następujące polecenie

aspnet_regsql –S  <server_name>  -d  <database_name>  -ssadd  -sstype c  -E


gdzie:

a.       Server_name – nazwa serwera baz danych na którym znajduje się baza danych od MOSS (content database);

b.      Database_name – nazwa bazy danych od MOSS (kontent database).

8.       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!
Opublikowane 16 sierpnia 08 10:32 przez Gutek
Filed under: ,

Komentarze:

# Mahoney said on czerwca 29, 2009 13:28:

Przy wykonywaniu polecenia "aspnet_regsql..." parametr -d oznacza bazę danych "Content Database" dla "Shared Service Provider-a".

Komentarze anonimowe wyłączone