Condividi tramite


Procedura: Creare un servizio che richiede sessioni

Le sessioni creano uno stato condiviso tra due o più endpoint che consentono funzionalità utili, ad esempio callback, sicurezza multi hop e associazioni tra client e istanze del servizio. Per altre informazioni sulle sessioni nelle applicazioni Windows Communication Foundation (WCF), vedere Uso di sessioni.

Per specificare che un contratto richieda il suo vincolo per supportare le sessioni

  1. Creare un contratto di servizio che abbia almeno un'operazione. Per un esempio di come creare un contratto di servizio, vedere Procedura: Definire un contratto di servizio.

  2. Modificare l'oggetto System.ServiceModel.ServiceContractAttribute che dichiara il contratto impostando la ServiceContractAttribute.SessionMode proprietà su:

  3. Configurare l'endpoint del servizio per usare un vincolo che supporta le sessioni. Nell'esempio di configurazione seguente viene illustrato l'uso di System.ServiceModel.WSDualHttpBinding, che supporta una sessione WS-ReliableMessaging.

    <appSettings>
      <!-- use appSetting to configure base address provided by host -->
      <add key="baseAddress" value="http://localhost:8080/ServiceMetadata" />
    </appSettings>
    <system.serviceModel>
      <services>
        <service 
          name="Microsoft.WCF.Documentation.DuplexHello"
          behaviorConfiguration="mex"
        >
          <endpoint
            address="/DuplexService"
            binding="wsDualHttpBinding"
            contract="Microsoft.WCF.Documentation.IDuplexHello"
           />
          <endpoint
            address=""
            binding="mexHttpBinding"
            contract="IMetadataExchange"
          />
        </service>
      </services>
      <behaviors>
        <serviceBehaviors>
          <behavior name="mex" >
            <serviceMetadata httpGetEnabled="true" />
          </behavior>
        </serviceBehaviors>
      </behaviors>
    </system.serviceModel>
    

Esempio

Il codice di esempio seguente illustra come specificare un requisito di sessione a livello di contratto e usare un file di configurazione per supportare tale requisito con l'associazione System.ServiceModel.WSDualHttpBinding .

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(
    Name = "SampleDuplexHello",
    Namespace = "http://microsoft.wcf.documentation",
    CallbackContract = typeof(IHelloCallbackContract),
    SessionMode = SessionMode.Required
  )]
  public interface IDuplexHello
  {
    [OperationContract(IsOneWay = true)]
    void Hello(string greeting);
  }

  public interface IHelloCallbackContract
  {
    [OperationContract(IsOneWay = true)]
    void Reply(string responseToGreeting);
  }

  [ServiceBehaviorAttribute(InstanceContextMode=InstanceContextMode.PerSession)]
  public class DuplexHello : IDuplexHello
  {

    public DuplexHello()
    {
      Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
    }

    ~DuplexHello()
    {
      Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
    }

    public void Hello(string greeting)
    {
      Console.WriteLine("Caller sent: " + greeting);
      Console.WriteLine("Session ID: " + OperationContext.Current.SessionId);
      Console.WriteLine("Waiting two seconds before returning call.");
      // Put a slight delay to demonstrate asynchronous behavior on client.
      Thread.Sleep(2000);
      IHelloCallbackContract callerProxy
        = OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
      string response = "Service object " + this.GetHashCode().ToString() + " received: " + greeting;
      Console.WriteLine("Sending back: " + response);
      callerProxy.Reply(response);
    }
  }
}


Imports System.Collections.Generic
Imports System.ServiceModel
Imports System.Threading

Namespace Microsoft.WCF.Documentation
    <ServiceContract(Name:="SampleDuplexHello", Namespace:="http://microsoft.wcf.documentation", _
                     CallbackContract:=GetType(IHelloCallbackContract), SessionMode:=SessionMode.Required)> _
    Public Interface IDuplexHello
        <OperationContract(IsOneWay:=True)> _
        Sub Hello(ByVal greeting As String)
    End Interface

    Public Interface IHelloCallbackContract
        <OperationContract(IsOneWay:=True)> _
        Sub Reply(ByVal responseToGreeting As String)
    End Interface

    <ServiceBehaviorAttribute(InstanceContextMode:=InstanceContextMode.PerSession)> _
    Public Class DuplexHello
        Implements IDuplexHello

        Public Sub New()
            Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
        End Sub

        Protected Overrides Sub Finalize()
            Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
        End Sub

        Public Sub Hello(ByVal greeting As String) Implements IDuplexHello.Hello
            Console.WriteLine("Caller sent: " & greeting)
            Console.WriteLine("Session ID: " & OperationContext.Current.SessionId)
            Console.WriteLine("Waiting two seconds before returning call.")
            ' Put a slight delay to demonstrate asynchronous behavior on client.
            Thread.Sleep(2000)
            Dim callerProxy As IHelloCallbackContract = OperationContext.Current.GetCallbackChannel(Of IHelloCallbackContract)()
            Dim response = "Service object " & Me.GetHashCode().ToString() & " received: " & greeting
            Console.WriteLine("Sending back: " & response)
            callerProxy.Reply(response)
        End Sub
    End Class
End Namespace
<appSettings>
  <!-- use appSetting to configure base address provided by host -->
  <add key="baseAddress" value="http://localhost:8080/ServiceMetadata" />
</appSettings>
<system.serviceModel>
  <services>
    <service 
      name="Microsoft.WCF.Documentation.DuplexHello"
      behaviorConfiguration="mex"
    >
      <endpoint
        address="/DuplexService"
        binding="wsDualHttpBinding"
        contract="Microsoft.WCF.Documentation.IDuplexHello"
       />
      <endpoint
        address=""
        binding="mexHttpBinding"
        contract="IMetadataExchange"
      />
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="mex" >
        <serviceMetadata httpGetEnabled="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

Vedere anche