Aracılığıyla paylaş


İstemci Mimarisi

Uygulamalar, hizmet işlemlerini çağırmak için Windows Communication Foundation (WCF) istemci nesnelerini kullanır. Bu konuda WCF istemci nesneleri, WCF istemci kanalları ve bunların temel kanal mimarisiyle ilişkileri açıklanmaktadır. WCF istemci nesnelerine temel bir genel bakış için bkz. WCF İstemcisine Genel Bakış. Kanal katmanı hakkında daha fazla bilgi için bkz. Kanal Katmanını Genişletme.

Genel Bakış

Hizmet modeli çalışma zamanı, aşağıdakilerden oluşan WCF istemcileri oluşturur:

  • Uygulama kodunuzdan gelen çağrıları giden iletilere dönüştüren ve yanıt iletilerini çıkış parametrelerine dönüştüren ve uygulamanızın alabildiği değerleri döndüren, otomatik olarak oluşturulan bir hizmet sözleşmesi istemci uygulaması.

  • Bir kontrol arabiriminin (System.ServiceModel.IClientChannel) uygulanması, çeşitli arabirimleri gruplandırarak denetim işlevselliğine erişim sağlar. Bu işlevsellik, özellikle istemci oturumunu kapatma ve kanalı kapatma yeteneğini içerir.

  • Kullanılan bağlama tarafından belirtilen yapılandırma ayarlarına göre oluşturulan bir istemci kanalı.

Uygulamalar, isteğe bağlı olarak bir System.ServiceModel.ChannelFactory veya ClientBase<TChannel> tarafından oluşturulan türev bir sınıfın örneğini oluşturarak bu tür istemciler oluşturabilir. Bu hazır istemci sınıfları, bir ChannelFactory tarafından dinamik olarak oluşturulan istemci kanalı uygulamasını kapsüller ve bu kanala yetki devreder. Bu nedenle, istemci kanalı ve bunları üreten kanal fabrikası bu tartışmanın odak noktasıdır.

İstemci Nesneleri ve İstemci Kanalları

WCF istemcilerinin System.ServiceModel.IClientChannel temel arabirimi, temel istemci işlevselliğinin yanı sıra temel iletişim nesnesi işlevselliğini System.ServiceModel.ICommunicationObject, bağlam işlevselliğini System.ServiceModel.IContextChannelve genişletilebilir davranışını kullanıma sunan arabirimidir System.ServiceModel.IExtensibleObject<T>.

IClientChannel Ancak arabirim, bir hizmet sözleşmesi tanımlamaz. Bunlar hizmet sözleşmesi arabirimi tarafından bildirilir (genellikle ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) gibi bir araç kullanılarak hizmet meta verilerinden oluşturulur). WCF istemci türleri, uygulamaların işlemleri doğrudan çağırabilmesi ve istemci tarafında çalışma zamanı işlevselliğine erişebilmesi için hem IClientChannel hem de hedef hizmet sözleşmesi arayüzünü genişletir. WCF istemcisi oluşturmak, WCFSystem.ServiceModel.ChannelFactory nesnelerine yapılandırılan hizmet uç noktasına bağlanabilen ve bunlarla etkileşim kurabilen bir çalışma zamanı oluşturmak için gereken bilgileri sağlar.

Daha önce belirtildiği gibi, bunları kullanabilmeniz için önce iki WCF istemci türünün yapılandırılması gerekir. En basit WCF istemci türleri, ClientBase<TChannel>'dan (veya hizmet sözleşmesi çift yönlü bir sözleşmeyse DuplexClientBase<TChannel>'den) türetilen nesnelerdir. Bu türleri bir oluşturucu kullanarak, program aracılığıyla yapılandırarak veya bir yapılandırma dosyası kullanarak oluşturabilir ve ardından hizmet işlemlerini çağırmak için doğrudan çağırabilirsiniz. Nesnelere ClientBase<TChannel> temel bir genel bakış için bkz. WCF İstemcisine Genel Bakış.

İkinci tür, CreateChannel yöntemine yapılan bir çağrı sonucunda, çalışma zamanında oluşturulur. İletişim ayrıntılarının sıkı denetimiyle ilgilenen uygulamalar genellikle istemci kanalı nesnesi olarak adlandırılan bu istemci türünü kullanır çünkü temel alınan istemci çalışma zamanı ve kanal sisteminden daha fazla doğrudan etkileşim sağlar.

Kanal Fabrikaları

İstemci çağrılarını destekleyen temel çalışma zamanını oluşturmakla sorumlu sınıf sınıfıdır System.ServiceModel.ChannelFactory<TChannel> . Hem WCF istemci nesneleri hem de WCF istemci kanalı nesneleri, örnekleri oluşturmak için bir ChannelFactory<TChannel> nesne kullanır; ClientBase<TChannel> türetilmiş istemci nesnesi kanal fabrikasının işlenmesini kapsüller, ancak bir dizi senaryo için kanal fabrikasını doğrudan kullanmak son derece mantıklıdır. Bunun yaygın senaryosu, mevcut bir fabrikadan tekrar tekrar yeni istemci kanalları oluşturmak istemenizdir. İstemci nesnesi kullanıyorsanız, bir WCF istemci nesnesinden temel kanal fabrikasını \ClientBase<TChannel>.ChannelFactory özelliğini çağırarak alabilirsiniz.

Kanal fabrikaları hakkında hatırlamanız gereken önemli şey, ChannelFactory<TChannel>.CreateChannel çağrılmadan önce kendilerine sağlanan yapılandırmaya uygun istemci kanallarının yeni örneklerini oluşturmalarıdır. CreateChannel (veya ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannel veya bir WCF istemci nesnesindeki herhangi bir işlemi) çağırdıktan sonra, kanal fabrikasını değiştiremezsiniz ve yalnızca hedef uç nokta adresini değiştirseniz bile farklı hizmet örneklerine kanallar oluşturmayı bekleyemezsiniz. Farklı bir yapılandırmaya sahip bir istemci nesnesi veya istemci kanalı oluşturmak istiyorsanız, önce yeni bir kanal fabrikası oluşturmanız gerekir.

WCF istemci nesnelerini ve WCF istemci kanallarını kullanmayla ilgili çeşitli sorunlar hakkında daha fazla bilgi için bkz. WCF İstemcisi Kullanarak Hizmetlere Erişme.

Aşağıdaki iki bölümde WCF istemci kanalı nesnelerinin oluşturulması ve kullanılması açıklanmaktadır.

Yeni WCF İstemci Kanalı Nesnesi Oluşturma

İstemci kanalı kullanımını göstermek için aşağıdaki hizmet sözleşmesinin oluşturulduğunu varsayalım.

[System.ServiceModel.ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
    [System.ServiceModel.OperationContractAttribute(
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
      ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
    )]
    [System.ServiceModel.FaultContractAttribute(
      typeof(microsoft.wcf.documentation.SampleFault),
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
    )]
    string SampleMethod(string msg);
}

Bir ISampleService hizmete bağlanmak için, oluşturulan sözleşme arabirimini doğrudan bir kanal fabrikası (ChannelFactory<TChannel>) ile kullanın. Belirli bir sözleşme için kanal fabrikası oluşturup yapılandırdıktan sonra, CreateChannel yöntemini çağırarak bir hizmetle ISampleService iletişim kurmak için kullanabileceğiniz istemci kanalı nesnelerini döndürebilirsiniz.

Bir hizmet sözleşmesi arabirimiyle ChannelFactory<TChannel> sınıfını kullanırken, kanalı açıkça açmak, kapatmak veya durdurmak için IClientChannel arabirimine dönüştürme yapmanız gerekir. Birlikte çalışmayı kolaylaştırmak için, Svcutil.exe aracı, hem hizmet sözleşmesi arabirimini hem de IClientChannel arabirimini uygulayan ve herhangi bir tür dönüştürme işlemine gerek kalmadan istemci kanal altyapısı ile etkileşim kurmanıza olanak tanıyan bir yardımcı arabirim oluşturur. Aşağıdaki kod, önceki hizmet sözleşmesini uygulayan yardımcı istemci kanalının tanımını gösterir.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}

Yeni WCF İstemci Kanalı Nesnesi Oluşturma

Bir hizmete bağlanmak için bir istemci kanalını kullanırken, oluşturulan sözleşme arayüzünü (veya yardımcı sürümünü) doğrudan bir kanal fabrikası ile kullanın ve sözleşme arayüzünün türünü tür parametresi olarak geçirin. Belirli bir sözleşme için bir kanal fabrikası oluşturulduktan ve yapılandırıldıktan sonra, bir ChannelFactory<TChannel>.CreateChannel hizmeti ile iletişim kurmak için kullanabileceğiniz istemci kanal nesnelerini döndürmek üzere ISampleService metodunu çağırabilirsiniz.

İstemci kanalı nesneleri oluşturulduğunda IClientChannel ve sözleşme arayüzünü uygular. Bu nedenle, bu sözleşmeyi destekleyen bir hizmetle etkileşim kuran işlemleri çağırmak için bunları doğrudan kullanabilirsiniz.

İstemci nesnelerini ve istemci kanalı nesnelerini kullanma arasındaki fark, geliştiriciler için yalnızca denetim ve kullanım kolaylığından biridir. Sınıflar ve nesnelerle rahatça çalışabilen birçok geliştirici WCF istemci kanalı yerine WCF istemci nesnesini kullanmayı tercih eder.

Bir örnek için bkz . Nasıl yapılır: ChannelFactory'yi kullanma.