Share via


İstemci Kullanarak Hizmetlere Erişme

İstemci uygulamalarının hizmetlerle iletişim kurmak için WCF istemci veya kanal nesneleri oluşturması, yapılandırması ve kullanması gerekir. WCF İstemcisine Genel Bakış konusu, temel istemci ve kanal nesneleri oluşturma ve bunları kullanma ile ilgili nesnelere ve adımlara genel bir bakış sağlar.

Bu konu, senaryonuza bağlı olarak yararlı olabilecek istemci uygulamaları ve istemci ve kanal nesneleriyle ilgili bazı sorunlar hakkında ayrıntılı bilgi sağlar.

Genel bakış

Bu konu başlığı altında aşağıdakilerle ilgili davranışlar ve sorunlar açıklanmaktadır:

  • Kanal ve oturum ömrü.

  • Özel durumları işleme.

  • Engelleme sorunlarını anlama.

  • Kanalları etkileşimli olarak başlatma.

Kanal ve Oturum Yaşam Süreleri

Windows Communication Foundation (WCF) uygulamaları iki kanal kategorisi içerir: veri birimi ve oturum açma.

Veri birimi kanalı, tüm iletilerin bağıntısız olduğu bir kanaldır. Veri birimi kanalında bir giriş veya çıkış işlemi başarısız olursa, bir sonraki işlem genellikle etkilenmez ve aynı kanal yeniden kullanılabilir. Bu nedenle, veri birimi kanalları genellikle hata vermez.

Ancak oturum açma kanalları, diğer uç noktaya bağlantısı olan kanallardır. Bir taraftaki oturumdaki iletiler her zaman diğer taraftaki aynı oturumla ilişkilendirilir. Buna ek olarak, bir oturumdaki her iki katılımcının da bu oturumun başarılı olarak kabul edilmesi için konuşma gereksinimlerinin karşılandığını kabul etmesi gerekir. Kabul edemezlerse oturum açma kanalı hatalı olabilir.

İlk işlemi çağırarak istemcileri açık veya örtük olarak açın.

Not

Hataya neden olan oturumlu kanalları açıkça algılamaya çalışmak genellikle yararlı değildir, çünkü size bildirim geldiğinde oturum uygulamasına bağlıdır. Örneğin, (güvenilir oturum devre dışı bırakıldığında) TCP bağlantısının oturumunu ortaya çıkardığından System.ServiceModel.NetTcpBinding , hizmetteki veya istemcideki olayı dinlerseniz ICommunicationObject.Faulted , ağ hatası durumunda size hızlı bir şekilde bildirim gönderilir. Ancak güvenilir oturumlar (etkin olduğu System.ServiceModel.Channels.ReliableSessionBindingElement bağlamalar tarafından kurulan), hizmetleri küçük ağ hatalarından yalıtmak için tasarlanmıştır. Oturum makul bir süre içinde yeniden kurulabiliyorsa, aynı bağlama (güvenilir oturumlar için yapılandırılmış) kesinti daha uzun bir süre devam edene kadar hataya neden olmayabilir.

Sistem tarafından sağlanan bağlamaların çoğu (kanalları uygulama katmanına sunan) varsayılan olarak oturumları kullanır, ancak System.ServiceModel.BasicHttpBinding kullanmaz. Daha fazla bilgi için bkz . Oturumları Kullanma.

Oturumların Düzgün Kullanımı

Oturumlar, ileti değişiminin tamamının tamamlanıp tamamlanmadiğini ve her iki tarafın da başarılı olduğunu kabul edip etmediğini anlamanın bir yolunu sağlar. Bir arama uygulamasının kanalı açması, kullanması ve bir deneme bloğu içinde kanalı kapatması önerilir. Oturum kanalı açıksa ve ICommunicationObject.Close yöntem bir kez çağrılırsa ve bu çağrı başarıyla döndürülüyorsa oturum başarılı olur. Bu durumda başarılı olması, tüm teslimin belirtilen bağlamanın karşılandığını garanti ettiğini ve diğer tarafın çağırmadan Closeönce kanalda aramadığı ICommunicationObject.Abort anlamına gelir.

Aşağıdaki bölümde bu istemci yaklaşımının bir örneği verilmiştir.

Özel Durumları İşleme

İstemci uygulamalarında özel durumları işlemek basittir. Bir kanal bir deneme bloğu içinde açılır, kullanılır ve kapatılırsa, özel durum oluşturmadığı sürece konuşma başarılı olur. Genellikle, bir özel durum oluşursa konuşma durduruldu.

Not

deyiminin using (Using Visual Basic'te) kullanılması önerilmez. Bunun nedeni, deyiminin sonunun using bilmeniz gerekebilecek diğer özel durumları maskeleyebilecek özel durumlara neden olabilmesidir. Daha fazla bilgi için bkz . WCF istemci kaynaklarını serbest bırakmak için Kapat ve Durdur'u kullanma.

Aşağıdaki kod örneği, deyimini değil try/catch bloğunu kullanan önerilen istemci desenini using gösterir.

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using Microsoft.WCF.Documentation;

public class Client
{
  public static void Main()
  {
    // Picks up configuration from the config file.
    SampleServiceClient wcfClient = new SampleServiceClient();
    try
    {
      // Making calls.
      Console.WriteLine("Enter the greeting to send: ");
      string greeting = Console.ReadLine();
      Console.WriteLine("The service responded: " + wcfClient.SampleMethod(greeting));

      Console.WriteLine("Press ENTER to exit:");
      Console.ReadLine();

      // Done with service.
      wcfClient.Close();
      Console.WriteLine("Done!");
    }
    catch (TimeoutException timeProblem)
    {
      Console.WriteLine("The service operation timed out. " + timeProblem.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
    catch (FaultException<GreetingFault> greetingFault)
    {
      Console.WriteLine(greetingFault.Detail.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
    catch (FaultException unknownFault)
    {
      Console.WriteLine("An unknown exception was received. " + unknownFault.Message);
      Console.ReadLine();
      wcfClient.Abort();
    }
    catch (CommunicationException commProblem)
    {
      Console.WriteLine("There was a communication problem. " + commProblem.Message + commProblem.StackTrace);
      Console.ReadLine();
      wcfClient.Abort();
    }
  }
}

Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports Microsoft.WCF.Documentation

Public Class Client
    Public Shared Sub Main()
        ' Picks up configuration from the config file.
        Dim wcfClient As New SampleServiceClient()
        Try
            ' Making calls.
            Console.WriteLine("Enter the greeting to send: ")
            Dim greeting As String = Console.ReadLine()
            Console.WriteLine("The service responded: " & wcfClient.SampleMethod(greeting))

            Console.WriteLine("Press ENTER to exit:")
            Console.ReadLine()

            ' Done with service. 
            wcfClient.Close()
            Console.WriteLine("Done!")
        Catch timeProblem As TimeoutException
            Console.WriteLine("The service operation timed out. " & timeProblem.Message)
            Console.ReadLine()
            wcfClient.Abort()
        Catch greetingFault As FaultException(Of GreetingFault)
            Console.WriteLine(greetingFault.Detail.Message)
            Console.ReadLine()
            wcfClient.Abort()
        Catch unknownFault As FaultException
            Console.WriteLine("An unknown exception was received. " & unknownFault.Message)
            Console.ReadLine()
            wcfClient.Abort()
        Catch commProblem As CommunicationException
            Console.WriteLine("There was a communication problem. " & commProblem.Message + commProblem.StackTrace)
            Console.ReadLine()
            wcfClient.Abort()
        End Try
    End Sub
End Class

Not

Özelliğin değerinin ICommunicationObject.State denetlenmesi bir yarış durumudur ve kanalın yeniden kullanılıp yeniden kullanılmayacağını veya kapatılıp kapatılmayacağının belirlenmesi önerilmez.

Veri birimi kanalları kapatıldığında özel durumlar ortaya çıksa bile hiçbir zaman hata vermez. Buna ek olarak, güvenli bir konuşma kullanarak kimlik doğrulaması başarısız olan çift yönlü olmayan istemciler genellikle bir System.ServiceModel.Security.MessageSecurityExceptionoluşturur. Ancak güvenli bir konuşma kullanan çift yönlü istemci kimlik doğrulamasında başarısız olursa, istemci bunun yerine bir System.TimeoutException alır.

Uygulama düzeyinde hata bilgileriyle çalışma hakkında daha fazla bilgi için bkz . Sözleşmelerde ve Hizmetlerde Hataları Belirtme ve İşleme. Beklenen Özel Durumlar beklenen özel durumları açıklar ve bunların nasıl işleneceğini gösterir. Kanal geliştirirken hataları işleme hakkında daha fazla bilgi için bkz . Özel Durumları ve Hataları İşleme.

İstemci Engelleme ve Performans

Bir uygulama bir istek-yanıt işlemini zaman uyumlu olarak çağırdığında, istemci bir dönüş değeri alınana veya bir özel durum (örneğin) oluşana System.TimeoutExceptionkadar engeller. Bu davranış, yerel davranışa benzer. Uygulama bir WCF istemci nesnesi veya kanalında zaman uyumlu bir şekilde bir işlemi çağırdığında, kanal katmanı verileri ağa yazıncaya kadar veya bir özel durum oluşana kadar istemci geri dönmez. Tek yönlü ileti değişimi düzeni (bir işlemi OperationContractAttribute.IsOneWay olarak işaretleyerek truebelirtilir) bazı istemcileri daha hızlı yanıt verebilirken, bağlamaya ve gönderilen iletilere bağlı olarak tek yönlü işlemler de engelleyebilir. Tek yönlü işlemler yalnızca ileti değişimiyle ilgilidir, ne çok ne de daha azdır. Daha fazla bilgi için bkz . Tek Yönlü Hizmetler.

Büyük veri öbekleri, ileti değişimi deseni ne olursa olsun istemcinin işlenmesini yavaşlatabilir. Bu sorunların nasıl işleneceğini anlamak için bkz . Büyük Veri ve Akış.

Uygulamanızın bir işlem tamamlarken daha fazla çalışma yapması gerekiyorsa, WCF istemcinizin uyguladığı hizmet sözleşmesi arabiriminde zaman uyumsuz bir yöntem çifti oluşturmanız gerekir. Bunu yapmanın en kolay yolu ServiceModel Meta Veri Yardımcı Programı Aracı'nda (Svcutil.exe) anahtarı kullanmaktır/async. Bir örnek için bkz . Nasıl yapılır: Hizmet İşlemlerini Zaman Uyumsuz Olarak Çağırma.

İstemci performansını artırma hakkında daha fazla bilgi için bkz . Orta Katman İstemci Uygulamaları.

Kullanıcının Kimlik Bilgilerini Dinamik Olarak Seçmesini Etkinleştirme

Arabirim, IInteractiveChannelInitializer uygulamaların zaman aşımı süreölçerleri başlamadan önce kanalın oluşturulacak kimlik bilgilerini seçmesine olanak tanıyan bir kullanıcı arabirimi görüntülemesini sağlar.

Uygulama geliştiricileri eklenen IInteractiveChannelInitializer bir öğeyi iki şekilde kullanabilir. İstemci uygulaması kanalı açmadan önce veya IClientChannel.DisplayInitializationUI (veya zaman uyumsuz bir sürüm) çağırabilir ClientBase<TChannel>.DisplayInitializationUI (açık yaklaşım) veya ilk işlemi (örtük yaklaşım) çağırabilir.

Örtük yaklaşımı kullanıyorsanız, uygulamanın veya ClientBase<TChannel>IClientChannel uzantısında ilk işlemi çağırması gerekir. İlk işlem dışında bir şey çağırırsa, bir özel durum oluşturulur.

Açık yaklaşımı kullanıyorsanız, uygulamanın aşağıdaki adımları sırayla gerçekleştirmesi gerekir:

  1. ClientBase<TChannel>.DisplayInitializationUI veya IClientChannel.DisplayInitializationUI (ya da zaman uyumsuz bir sürümü) çağır.

  2. Başlatıcılar döndürdüyse, nesnede IClientChannel veya özelliğinden döndürülen nesnede IClientChannel yöntemini çağırın OpenClientBase<TChannel>.InnerChannel.

  3. Çağrı işlemleri.

Üretim kalitesindeki uygulamaların açık yaklaşımı benimseyerek kullanıcı arabirimi sürecini denetlemesi önerilir.

Örtük yaklaşımı kullanan uygulamalar kullanıcı arabirimi başlatıcılarını çağırır, ancak uygulamanın kullanıcısı bağlamanın gönderme zaman aşımı süresi içinde yanıt vermezse, kullanıcı arabirimi döndürdüğünde bir özel durum oluşur.

Ayrıca bkz.