Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
İ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 Ömürleri
Windows Communication Foundation (WCF) uygulamaları, veri birimi ve oturumlu olarak iki kanal kategorisi içerir.
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 tabanlı 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 oturumlu kanal hatalı olabilir.
İlk işlemi çağırarak istemcileri açık veya örtük olarak açın.
Uyarı
Arızalı oturumlu kanalları açıkça algılamaya çalışmak genellikle yararlı değildir, çünkü bildirim aldığınız zaman oturum uygulamasına bağlıdır. Örneğin, System.ServiceModel.NetTcpBinding (güvenilir oturum devre dışı bırakıldığında) TCP bağlantısının oturumunu ortaya çıkardığından, hizmette veya istemcide ICommunicationObject.Faulted olayını dinlerseniz, ağ hatası durumunda hızlı bir şekilde bilgilendirilebilirsiniz. Ancak güvenilir oturumlar (System.ServiceModel.Channels.ReliableSessionBindingElement etkinleştirildiğinde oluşturulan bağlamalar) 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 örnekte başarılı olmanın anlamı, teslimatın belirtilen bağlayıcı garantileri karşıladığını ve diğer tarafın ICommunicationObject.Abort'den önce kanalda Close çağırmamış olmasıdır.
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, istisna atılmadığı sürece işlem başarılı olmuştur. Genellikle, bir istisna oluşursa, konuşma sonlandırılır.
Uyarı
deyiminin using (Using Visual Basic'te) kullanılması önerilmez. Bunun nedeni, deyimin sonunun bilmeniz gerekebilecek diğer özel durumları maskeleyen bir özel duruma yol açabilmesidir. 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, önerilen istemci desenini try/catch bloğu kullanarak gösterir ve using deyimini kullanmaz.
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
Uyarı
ICommunicationObject.State özelliğinin değerinin kontrol edilmesi bir yarış koşuludur ve kanalın yeniden kullanılmasına veya kapatılmasına karar vermek için önerilmez.
Datagram kanalları kapatıldıklarında bile özel durumlar oluşsa dahi asla hata vermez. Buna ek olarak, güvenli bir konuşma kullanarak kimlik doğrulaması başarısız olan dupleks olmayan istemciler genellikle bir System.ServiceModel.Security.MessageSecurityException hatası atar. 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 istisna (örneğin System.TimeoutException) oluşana kadar engellenir. 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şim değişim düzeni (bir işlemi OperationContractAttribute.IsOneWay olarak işaretleyerek true belirtilir), bazı istemcilerin daha hızlı yanıt vermesini sağlarken, bağlamaya ve önceden gönderilen iletilere bağlı olarak tek yönlü işlemler de engellenebilir. 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. One-Way Hizmetleri.
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/async. Bir örnek için bkz: Nasıl Yapılır: Hizmet İşlemlerini Eşzamansız Olarak Çağırma.
İstemci performansını artırma hakkında daha fazla bilgi için bkz. Middle-Tier İstemci Uygulamaları.
Kullanıcının Kimlik Bilgilerini Dinamik Olarak Seçmesini Etkinleştirme
Arayüz, IInteractiveChannelInitializer uygulamaların zaman aşımı süreölçerleri başlamadan önce bir kanalın oluşturulabilmesi için kullanıcının kimlik bilgilerini seçmesine olanak tanıyan bir kullanıcı arayüzü görüntülemesini sağlar.
Uygulama geliştiricileri eklenen IInteractiveChannelInitializer bir öğeyi iki şekilde kullanabilir. İstemci uygulaması, kanalı açmadan önce ClientBase<TChannel>.DisplayInitializationUI veya IClientChannel.DisplayInitializationUI'yi (veya zaman uyumsuz bir sürümü) çağırabilir (açık yaklaşım) ya da ilk işlemi çağırabilir (örtük yaklaşım).
Örtük yaklaşımı kullanıyorsanız, uygulama ilk işlemi bir ClientBase<TChannel> veya IClientChannel uzantısında çağırmalıdır. İlk işlemden farklı bir şey çağırılırsa, bir hata oluşturulur.
Açık yaklaşımı kullanıyorsanız, uygulamanın aşağıdaki adımları sırayla gerçekleştirmesi gerekir:
ClientBase<TChannel>.DisplayInitializationUI veya IClientChannel.DisplayInitializationUI (ya da zaman uyumsuz bir sürümü) çağır.
Başlatıcılar döndüğünde, Open nesnesindeki IClientChannel yöntemini veya IClientChannel özelliğinden döndürülen ClientBase<TChannel>.InnerChannel nesnesindeki yöntemi çağırın.
Ç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 ve uygulamanın kullanıcısı bağlayıcının gönderim zaman aşımı süresi içinde yanıt vermezse, kullanıcı arabirimi geri döndüğünde bir istisna fırlatılır.
Ayrıca bakınız
- Çift Yönlü Hizmetler
- Nasıl yapılır: One-Way ve Request-Reply Sözleşmeleriyle Hizmetlere Erişme
- Nasıl yapılır: Çift Yönlü Sözleşme ile Hizmetlere Erişme
- Nasıl yapılır: WSE 3.0 Hizmetine Erişme
- Nasıl yapılır: ChannelFactory Kullanma
- Nasıl yapılır: Hizmet İşlemlerini Zaman Uyumsuz Olarak Çağırma
- Middle-Tier İstemci Uygulamaları