다음을 통해 공유


방법: 세션이 필요한 서비스 만들기

세션은 콜백, 다중 홉 보안 및 클라이언트와 서비스 인스턴스 간의 연결과 같은 유용한 기능을 사용하는 둘 이상의 끝점 사이에서 공유 상태를 만듭니다. WCF(Windows Communication Foundation) 응용 프로그램의 세션에 대한 자세한 내용은 세션 사용을 참조하십시오.

계약에서 바인딩이 세션을 지원하도록 지정하려면

  1. 작업을 하나 이상 포함하는 서비스 계약을 만듭니다. 서비스 계약을 만드는 방법에 대한 예제는 방법: Windows Communication Foundation 서비스 계약 정의를 참조하십시오.

  2. System.ServiceModel.ServiceContractAttribute.SessionMode 속성을 다음으로 설정하여 계약을 선언하는 System.ServiceModel.ServiceContractAttribute를 수정합니다.

  3. 세션을 지원하는 바인딩을 사용하도록 서비스 끝점을 구성합니다. 다음 구성 예제에서는 WS-ReliableMessaging 세션을 지원하는 System.ServiceModel.WSDualHttpBinding을 사용하는 방법을 보여 줍니다.

    <appSettings>
      <!-- use appSetting to configure base address provided by host -->
      <add key="baseAddress" value="https://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>
    

예제

다음 예제 코드에서는 계약 수준 세션 요구 사항을 지정하고 구성 파일을 사용하여 System.ServiceModel.WSDualHttpBinding 바인딩을 통해 해당 요구 사항을 지원하는 방법을 보여 줍니다.


Imports System
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
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);
    }
  }
}
<appSettings>
  <!-- use appSetting to configure base address provided by host -->
  <add key="baseAddress" value="https://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>

참고 항목

참조

System.ServiceModel.ServiceContractAttribute
System.ServiceModel.ServiceContractAttribute.SessionMode
System.ServiceModel.SessionMode