Aracılığıyla paylaş


One-Way

Oneway örneği, tek yönlü hizmet operasyonlarıyla hizmet bağlantısını gösterir. İstemci, iki yönlü hizmet işlemleri için olduğu gibi hizmet işlemlerinin tamamlanmasını beklemez. Bu örnek Başlarken'i temel alır ve bağlamayı wsHttpBinding kullanır. Bu örnekteki hizmet, istekleri alan ve işleyen hizmeti gözlemlemenizi sağlayan kendi kendini barındıran bir konsol uygulamasıdır. İstemci aynı zamanda bir konsol uygulamasıdır.

Uyarı

Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.

Tek yönlü bir hizmet sözleşmesi oluşturmak için hizmet sözleşmenizi tanımlayın, sınıfı her işleme uygulayın OperationContractAttribute ve aşağıdaki örnek kodda gösterildiği gibi olarak ayarlayın 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);
}

İstemcinin hizmet işlemlerinin tamamlanmasını beklemediğini göstermek için, bu örnekteki hizmet kodu aşağıdaki örnek kodda gösterildiği gibi beş saniyelik bir gecikme uygular:

// 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);
    }
    ...
}

İstemci hizmeti çağırdığında, çağrı hizmet işleminin tamamlanmasını beklemeden geri döner.

Örneği çalıştırdığınızda, istemci ve hizmet etkinlikleri hem hizmet hem de istemci konsol pencerelerinde görüntülenir. Hizmetin istemciden ileti aldığını görebilirsiniz. Hem hizmeti hem de istemciyi kapatmak için her konsol penceresinde ENTER tuşuna basın.

İstemci, hizmeti önce tamamlayarak, tek yönlü hizmet işlemlerinin sonlanmasını beklemediğini gösterir. İstemci çıkışı aşağıdaki gibidir:

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

Press <ENTER> to terminate client.

Aşağıdaki hizmet çıkışı gösterilir:

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

Uyarı

HTTP, tanıma göre bir istek/yanıt protokolüdür; bir istek yapıldığında yanıt döndürülür. Bu, HTTP üzerinden kullanıma sunulan tek yönlü bir hizmet işlemi için bile geçerlidir. İşlem çağrıldığında hizmet, hizmet işlemi yürütülmeden önce 202 http durum kodunu döndürür. Bu durum kodu, isteğin işlenmek üzere kabul edildiği ancak işlemenin henüz tamamlanmadığı anlamına gelir. İşlem çağıran istemci, hizmetten 202 yanıtını alıncaya kadar engeller. Bu, oturumları kullanmak üzere yapılandırılmış bir bağlama kullanılarak birden çok tek yönlü ileti gönderildiğinde bazı beklenmeyen davranışlara neden olabilir. wsHttpBinding Bu örnekte kullanılan bağlama, bir güvenlik bağlamı oluşturmak için varsayılan olarak oturumları kullanacak şekilde yapılandırılır. Varsayılan olarak, bir oturumdaki iletilerin gönderilme sırasına göre ulaşması garanti edilir. Bu nedenle, bir oturumdaki ikinci ileti gönderildiğinde, ilk ileti işlenene kadar işlenmez. Bunun sonucu, önceki iletinin işlenmesi tamamlanana kadar istemcinin bir ileti için 202 yanıtını almamasıdır. Bu nedenle istemci, sonraki her işlem çağrısında engelleniyor gibi görünür. Bu davranışı önlemek için bu örnek, işlenmek üzere farklı örneklere iletileri eşzamanlı olarak göndermek üzere çalışma zamanını yapılandırıyor. Örnek, her iletinin farklı bir örnek tarafından işlenebilmesi için InstanceContextMode'i PerCall olarak ayarlar. ConcurrencyMode, aynı anda birden fazla iş parçacığının ileti göndermesine izin vermek için Multiple olarak ayarlanır.

Örneği ayarlamak, derlemek ve çalıştırmak için

  1. Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.

  2. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örneklerioluşturma başlığındaki yönergeleri izleyin.

  3. Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.

Uyarı

İstemciyi çalıştırmadan önce hizmeti çalıştırın ve hizmeti kapatmadan önce istemciyi kapatın. Hizmet ortadan kalktığı için istemcinin güvenlik oturumunu temiz bir şekilde kapatamaması durumunda, istemcide bir istisna oluşmasını önler.