Chiunque programmi in ASP .NET conosce bene l’oggetto HttpContext, che consente di recuperare informazioni sul contesto HTTP della richiesta corrente; in particolare, la sua proprietà statica Current permette di ottenere, da qualunque punto del codice, il contesto corrente. Un suo tipico utilizzo consiste nell’inserire, all’interno della collezione Items, tutti gli oggetti che devono vivere per tutta la durata della richiesta HTTP.
WCF non offre “direttamente” un oggetto di questo tipo. Esso, però, mette a disposizione la proprietà OperationContext.Current.Extensions, grazie a cui possiamo aggiungere vere e proprie “estensioni” da associare al contesto della richiesta. In questo modo, possiamo facilmente creare una classe WcfContext, che si comporti in modo analogo a HttpContext:
' VB .NET
Imports System.ServiceModel
Friend Class WcfContext
Implements IExtension(Of OperationContext)
Private ReadOnly m_items As IDictionary
Private Sub New()
m_items = New Hashtable()
End Sub
Public ReadOnly Property Items() As IDictionary
Get
Return m_items
End Get
End Property
Public Shared ReadOnly Property Current() As WcfContext
Get
If OperationContext.Current Is Nothing Then
Return Nothing
End If
Dim extensions = OperationContext.Current.Extensions
Dim context As WcfContext = extensions.Find(Of WcfContext)()
If context Is Nothing Then
context = New WcfContext()
extensions.Add(context)
End If
Return context
End Get
End Property
Public Sub Attach(ByVal owner As OperationContext) Implements IExtension(Of OperationContext).Attach
End Sub
Public Sub Detach(ByVal owner As OperationContext) Implements IExtension(Of OperationContext).Detach
End Sub
End Class
// C#
using System;
using System.Collections;
using System.Collections.Generic;
using System.ServiceModel;
/// <exclude />
public class WcfContext : IExtension<OperationContext>
{
private readonly IDictionary m_items;
private WcfContext()
{
m_items = new Hashtable();
}
public IDictionary Items
{
get { return m_items; }
}
public static WcfContext Current
{
get
{
if (OperationContext.Current == null)
return null;
var extensions = OperationContext.Current.Extensions;
WcfContext context = extensions.Find<WcfContext>();
if (context == null)
{
context = new WcfContext();
extensions.Add(context);
}
return context;
}
}
public void Attach(OperationContext owner)
{ }
public void Detach(OperationContext owner)
{ }
}
La proprietà WcfContext.Current controlla se, tra le estensioni dell’oggetto OperationContext, ne esiste una di tipo WcfContext; in caso positivo, la restituisce, altrimenti la crea e la aggiunge alla collezione. Questo oggetto espone poi una proprietà di nome Items e tipo IDictionary, che dunque si comporta esattamente come l’analogo di HttpContext.