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ı.

  • Çeşitli arabirimleri bir araya getiren ve denetim işlevselliğine erişim sağlayan bir denetim arabiriminin (System.ServiceModel.IClientChannel) uygulanması, özellikle istemci oturumunu kapatma ve kanalı atma olanağı.

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

Uygulamalar, ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) tarafından oluşturulan türetilmiş bir ClientBase<TChannel> sınıfın örneğini oluşturarak veya aracılığıyla System.ServiceModel.ChannelFactory isteğe bağlı olarak bu tür istemciler oluşturabilir. Bu hazır istemci sınıfları, tarafından dinamik olarak oluşturulan bir istemci kanalı uygulamasını kapsüller ve bu uygulamaya temsilci olarak atanır ChannelFactory. 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ğırmasını ve istemci tarafı çalışma zamanı işlevselliğine erişmesini sağlamak için hem hem de IClientChannel hedef hizmet sözleşmesi arabirimini genişletir. WCF istemcisi oluşturmak, WCFSystem.ServiceModel.ChannelFactory nesnelerine yapılandırılmış 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, (veya DuplexClientBase<TChannel> hizmet sözleşmesi çift yönlü bir sözleşmeyse) türetilen ClientBase<TChannel> 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, yöntemine CreateChannel yapılan bir çağrıdan ç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 olan 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, özelliğini çağırarak bir WCF istemci nesnesinden temel kanal fabrikasını ClientBase<TChannel>.ChannelFactory alabilirsiniz.

Kanal fabrikaları hakkında hatırlamanız gereken önemli şey, çağırmadan ChannelFactory<TChannel>.CreateChannelönce kendilerine sağlanan yapılandırma için istemci kanallarının yeni örneklerini oluşturmalarıdır. Bir WCF istemci nesnesinde (veya ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChannelveya herhangi bir işlemi) çağırdığınızda CreateChannel , kanal fabrikasını değiştiremezsiniz ve yalnızca hedef uç nokta adresini değiştirseniz bile farklı hizmet örneklerine kanal almayı beklersiniz. 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, bir hizmetle ISampleService iletişim kurmak için kullanabileceğiniz istemci kanalı nesnelerini döndürmek için yöntemini çağırabilirsinizCreateChannel.

sınıfını ChannelFactory<TChannel> bir hizmet sözleşmesi arabirimiyle kullanırken, kanalı açıkça açmak, kapatmak veya durdurmak için arabirime atamanız IClientChannel gerekir. birlikte çalışmayı kolaylaştırmak için, Svcutil.exe aracı hem hizmet sözleşmesi arabirimini uygulayan hem de istemci kanalı altyapısıyla yayın yapmanıza gerek kalmadan etkileşim kurmanızı sağlayan bir yardımcı arabirim IClientChannel de 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 istemci kanalını kullanmak için ISampleService , oluşturulan sözleşme arabirimini (veya yardımcı sürümü) doğrudan bir kanal fabrikasıyla kullanın ve sözleşme arabiriminin türünü tür parametresi olarak geçirin. Belirli bir sözleşme için kanal fabrikası oluşturulduktan ve yapılandırıldıktan sonra, bir hizmetle ISampleService iletişim kurmak için kullanabileceğiniz istemci kanalı nesnelerini döndürmek için yöntemini çağırabilirsinizChannelFactory<TChannel>.CreateChannel.

İstemci kanalı nesneleri oluşturulduğunda ve sözleşme arabirimini uygular IClientChannel . 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.