Around and About .NET World

Il blog di Marco Minerva
posts - 1671, comments - 2232, trackbacks - 2135

My Links

News

Contattami su Live Messenger:


MCTS: Windows, Web, Distributed Applications & SQL Server

MCPD: Enterprise Applications

Tag Cloud

Archives

Post Categories

Links

Analogo di HttpContext per il mondo WCF

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.

Print | posted on lunedì 26 luglio 2010 15:10 | Filed Under [ C# VB .NET ASP .NET ]

Feedback

Gravatar

# re: Analogo di HttpContext per il mondo WCF

Hai detto bene... Usando il contesto del thread, bisogna preoccuparsi di ripulirlo esplicitamente alla fine della richiesta, invece usando l'oggetto OperationContext, è tutto fatto in automatico :-)
26/07/2010 18:35 | Marco Minerva
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET