다음을 통해 공유


One-Way

Oneway 샘플은 단방향 서비스 연산을 사용하는 서비스 인터페이스를 보여 줍니다. 클라이언트는 양방향 서비스 작업의 경우처럼 서비스 작업이 완료되기를 기다리지 않습니다. 이 샘플은 시작 에 기반하며 바인딩을 wsHttpBinding 사용합니다. 이 샘플의 서비스는 요청을 수신하고 처리하는 서비스를 관찰할 수 있도록 하는 자체 호스팅 콘솔 애플리케이션입니다. 클라이언트는 콘솔 애플리케이션이기도 합니다.

비고

이 샘플에 대한 설치 절차 및 빌드 지침은 이 항목의 끝에 있습니다.

단방향 서비스 계약을 만들려면 서비스를 정의하고, 각 작업에 OperationContractAttribute 클래스를 적용한 다음, 다음 샘플 코드와 같이 IsOneWaytrue로 설정합니다.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOneWayCalculator
{
    [OperationContract(IsOneWay=true)]
    void Add(double n1, double n2);
    [OperationContract(IsOneWay = true)]
    void Subtract(double n1, double n2);
    [OperationContract(IsOneWay = true)]
    void Multiply(double n1, double n2);
    [OperationContract(IsOneWay = true)]
    void Divide(double n1, double n2);
}

클라이언트가 서비스 작업이 완료되기를 기다리지 않음을 나타내기 위해 이 샘플의 서비스 코드는 다음 샘플 코드와 같이 5초 지연을 구현합니다.

// This service class implements the service contract.
// This code writes output to the console window.
 [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
    InstanceContextMode = InstanceContextMode.PerCall)]
public class CalculatorService : IOneWayCalculator
{
    public void Add(double n1, double n2)
    {
        Console.WriteLine("Received Add({0},{1}) - sleeping", n1, n2);
        System.Threading.Thread.Sleep(1000 * 5);
        double result = n1 + n2;
        Console.WriteLine("Processing Add({0},{1}) - result: {2}", n1, n2, result);
    }
    ...
}

클라이언트가 서비스를 호출하면 서비스 작업이 완료되는 것을 기다리지 않고 호출이 반환됩니다.

샘플을 실행하면 서비스 및 클라이언트 콘솔 창에 클라이언트 및 서비스 활동이 모두 표시됩니다. 서비스가 클라이언트에서 메시지를 수신하는 것을 볼 수 있습니다. 각 콘솔 창에서 Enter 키를 눌러 서비스와 클라이언트를 모두 종료합니다.

클라이언트는 서비스보다 먼저 완료되어 클라이언트가 단방향 서비스 작업이 완료되기를 기다리지 않음을 보여 줍니다. 클라이언트 출력은 다음과 같습니다.

Add(100,15.99)
Subtract(145,76.54)
Multiply(9,81.25)
Divide(22,7)

Press <ENTER> to terminate client.

다음 서비스 출력이 표시됩니다.

The service is ready.
Press <ENTER> to terminate service.

Received Add(100,15.99) - sleeping
Received Subtract(145,76.54) - sleeping
Received Multiply(9,81.25) - sleeping
Received Divide(22,7) - sleeping
Processing Add(100,15.99) - result: 115.99
Processing Subtract(145,76.54) - result: 68.46
Processing Multiply(9,81.25) - result: 731.25
Processing Divide(22,7) - result: 3.14285714285714

비고

HTTP는 정의상 요청/응답 프로토콜입니다. 요청이 이루어지면 응답이 반환됩니다. HTTP를 통해 노출되는 단방향 서비스 작업에 대해서도 마찬가지입니다. 작업이 호출되면 서비스는 서비스 작업이 실행되기 전에 202의 HTTP 상태 코드를 반환합니다. 이 상태 코드는 처리를 위해 요청이 수락되었지만 처리가 아직 완료되지 않았다는 것을 의미합니다. 서비스에서 202 응답을 받을 때까지 작업 블록을 호출한 클라이언트입니다. 이로 인해 세션을 사용하도록 구성된 바인딩을 사용하여 여러 단방향 메시지를 보낼 때 예기치 않은 동작이 발생할 수 있습니다. 이 샘플에서 사용되는 바인딩은 wsHttpBinding 기본적으로 세션을 사용하여 보안 컨텍스트를 설정하도록 구성됩니다. 기본적으로 세션의 메시지는 전송되는 순서대로 도착하도록 보장됩니다. 이 때문에 세션의 두 번째 메시지가 전송되면 첫 번째 메시지가 처리될 때까지 처리되지 않습니다. 그 결과 클라이언트는 이전 메시지의 처리가 완료될 때까지 메시지에 대한 202 응답을 받지 못합니다. 따라서 각 후속 작업 호출에서 클라이언트가 차단되는 것처럼 보입니다. 이 동작을 방지하기 위해 이 샘플은 처리를 위해 메시지를 고유한 인스턴스로 동시에 디스패치하도록 런타임을 구성합니다. 샘플은 각 메시지를 다른 인스턴스에서 처리할 수 있도록 설정합니다 InstanceContextModePerCall . ConcurrencyMode이 한 번에 여러 스레드가 메시지를 디스패치할 수 있도록 Multiple으로 설정됩니다.

샘플을 설정, 빌드 및 실행하려면

  1. Windows Communication Foundation 샘플 에 대한One-Time 설정 절차를 수행했는지 확인합니다.

  2. 솔루션의 C# 또는 Visual Basic .NET 버전을 빌드하려면 Windows Communication Foundation 샘플빌드의 지침을 따릅니다.

  3. 단일 또는 컴퓨터 간 구성에서 샘플을 실행하려면 Windows Communication Foundation 샘플실행의 지침을 따릅니다.

비고

서비스를 종료하기 전에 클라이언트를 실행하고 클라이언트를 종료하기 전에 서비스를 실행합니다. 이렇게 하면 서비스가 사라지기 때문에 클라이언트가 보안 세션을 완전히 닫을 수 없는 경우 클라이언트 예외가 방지됩니다.