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

  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.NETFrameworkv2.0.50727);
  7. Wykonać następujące polecenie

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

    gdzie:

    • 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).
  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!

1 KOMENTARZ

  1. Przy wykonywaniu polecenia “aspnet_regsql…” parametr -d oznacza bazę danych “Content Database” dla “Shared Service Provider-a”.

Comments are closed.