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.