Megosztás a következőn keresztül:


Ügyfélarchitektúra

Az alkalmazások a Windows Communication Foundation (WCF) ügyfélobjektumait használják a szolgáltatásműveletek meghívásához. Ez a témakör a WCF-ügyfélobjektumokat, a WCF-ügyfélcsatornákat és a mögöttes csatornaarchitektúrához való viszonyukat ismerteti. A WCF-ügyfélobjektumok alapszintű áttekintéséhez tekintse meg a WCF-ügyfél áttekintését. A csatornarétegről további információt a Csatornaréteg kiterjesztése című témakörben talál.

Áttekintés

A szolgáltatásmodell futási ideje WCF-ügyfeleket hoz létre, amelyek a következőkből állnak:

  • Egy szolgáltatási szerződés automatikusan generált ügyfél-implementációja, amely az alkalmazáskódból érkező hívásokat kimenő üzenetekké alakítja, a válaszüzeneteket pedig kimeneti paraméterekké alakítja, és visszaadja az alkalmazás által lekérhető értékeket.

  • Egy vezérlőfelület (System.ServiceModel.IClientChannel) implementálása, amely csoportosítja a különböző interfészeket, és hozzáférést biztosít a vezérlési funkciókhoz, különösen az ügyfél munkamenetének bezárására és a csatorna elidegenítésére.

  • Egy ügyfélcsatorna, amely a használt kötés által megadott konfigurációs beállításokon alapul.

Az alkalmazások igény szerint System.ServiceModel.ChannelFactory hozhatnak létre ilyen ügyfeleket egy vagy egy ClientBase<TChannel> származtatott osztály egy példányának létrehozásával, amelyet a ServiceModel Metadata segédprogram (Svcutil.exe) hoz létre. Ezek a kész ügyfélosztályok olyan ügyfélcsatorna-implementációba ágyazódnak be és delegálnak, amelyet dinamikusan hoz létre egy ChannelFactory. Ezért a vita középpontjában az ügyfélcsatorna és az azokat előállító csatornagyár áll.

Ügyfélobjektumok és ügyfélcsatornák

A WCF-ügyfelek alap felülete az interfész, amely elérhetővé teszi az System.ServiceModel.IClientChannel alapvető ügyfélfunkciókat, valamint a kommunikációs objektumok alapvető funkcióit System.ServiceModel.ICommunicationObject, a környezet funkcióit System.ServiceModel.IContextChannelés a bővíthető viselkedését System.ServiceModel.IExtensibleObject<T>.

Az IClientChannel interfész azonban nem definiálja magát a szolgáltatási szerződést. Ezeket a szolgáltatási szerződés felülete deklarálja (általában a szolgáltatás metaadataiból jön létre egy olyan eszközzel, mint a ServiceModel Metadata Segédprogram (Svcutil.exe)). A WCF-ügyféltípusok mind IClientChannel a célszolgáltatás-szerződés felületét kiterjesztik, hogy az alkalmazások közvetlenül meghívhassák a műveleteket, és hozzáférhessenek az ügyféloldali futásidejű funkciókhoz is. A WCF-ügyfél létrehozása biztosítja a WCF-objektumokSystem.ServiceModel.ChannelFactory számára a futási idő létrehozásához szükséges információkat, amelyek képesek csatlakozni és kommunikálni a konfigurált szolgáltatásvégponttal.

Ahogy korábban említettük, a két WCF-ügyféltípust konfigurálni kell, mielőtt használhatja őket. A legegyszerűbb WCF-ügyféltípusok olyan objektumok, amelyekből ClientBase<TChannel> származik (vagy DuplexClientBase<TChannel> ha a szolgáltatási szerződés kétoldalas szerződés). Ezeket a típusokat konstruktor használatával, programozott módon vagy konfigurációs fájl használatával hozhatja létre, majd közvetlenül meghívhatja a szolgáltatásműveleteket. Az objektumok alapszintű áttekintéséhez ClientBase<TChannel> tekintse meg a WCF-ügyfél áttekintését.

A második típus futásidőben jön létre a metódus felé CreateChannel irányuló hívásból. A kommunikációs sajátosságok szigorú szabályozásával foglalkozó alkalmazások általában ezt az ügyféltípust , úgynevezett ügyfélcsatorna-objektumot használják, mivel közvetlenebb interakciót tesz lehetővé, mint az alapul szolgáló ügyfél futásideje és csatornarendszere.

Channel-gyárak

Az ügyfélhívásokat támogató mögöttes futási idő létrehozásáért felelős osztály az System.ServiceModel.ChannelFactory<TChannel> osztály. A WCF-ügyfélobjektumok és a WCF-ügyfélcsatorna-objektumok is ChannelFactory<TChannel> objektumot használnak a példányok létrehozásához; a ClientBase<TChannel> származtatott ügyfélobjektum magában foglalja a csatorna-előállító kezelését, de számos esetben teljesen ésszerű közvetlenül használni a csatorna-előállítót. Ez általában akkor fordul elő, ha új ügyfélcsatornákat szeretne létrehozni egy meglévő gyárból. Ha ügyfélobjektumot használ, a tulajdonság meghívásával ClientBase<TChannel>.ChannelFactory beszerezheti a mögöttes csatorna-előállítót egy WCF-ügyfélobjektumból.

A csatornagyárakról fontos megjegyezni, hogy a hívás ChannelFactory<TChannel>.CreateChannelelőtt új ügyfélcsatornákat hoznak létre a számukra megadott konfigurációhoz. Miután meghívta CreateChannel (vagy ClientBase<TChannel>.OpenClientBase<TChannel>.CreateChannelegy WCF-ügyfélobjektumon bármilyen műveletet), nem módosíthatja a csatorna-előállítót, és nem számíthat arra, hogy csatornákat kap különböző szolgáltatáspéldányokhoz, még akkor sem, ha csupán a célvégpont címét módosítja. Ha egy másik konfigurációjú ügyfélobjektumot vagy ügyfélcsatornát szeretne létrehozni, először létre kell hoznia egy új csatorna-előállítót.

A WCF-ügyfélobjektumok és a WCF-ügyfélcsatornák használatával kapcsolatos különböző problémákról további információt a Szolgáltatások elérése WCF-ügyfél használatával című témakörben talál.

Az alábbi két szakasz a WCF-ügyfélcsatorna-objektumok létrehozását és használatát ismerteti.

Új WCF-ügyfélcsatorna-objektum létrehozása

Az ügyfélcsatorna használatának szemléltetéséhez tegyük fel, hogy a következő szolgáltatási szerződés létrejött.

[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);
}

A szolgáltatáshoz való csatlakozáshoz ISampleService használja a létrehozott szerződéses felületet közvetlenül egy csatorna-előállítóval (ChannelFactory<TChannel>). Miután létrehozott és konfigurált egy csatorna-előállítót egy adott szerződéshez, meghívhatja a metódust az CreateChannel ügyfélcsatorna-objektumok visszaadására, amelyekkel kommunikálhat egy ISampleService szolgáltatással.

Ha az ChannelFactory<TChannel> osztályt szolgáltatásszerződéses felülettel használja, a IClientChannel csatornát explicit módon kell megnyitni, bezárni vagy megszakítani. A könnyebb munkavégzés érdekében a Svcutil.exe eszköz egy segédfelületet is létrehoz, amely a szolgáltatási szerződés felületét is implementálja, és IClientChannel lehetővé teszi az ügyfélcsatorna-infrastruktúrával való interakciót anélkül, hogy ki kellene adnia. Az alábbi kód az előző szolgáltatási szerződést megvalósító segítő ügyfélcsatorna definícióját mutatja be.

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

Új WCF-ügyfélcsatorna-objektum létrehozása

Ha ügyfélcsatornát szeretne használni egy ISampleService szolgáltatáshoz való csatlakozáshoz, használja a generált szerződéses felületet (vagy a segédverziót) közvetlenül egy csatorna-előállítóval, és adja át a szerződési felület típusát típusparaméterként. Miután létrehozta és konfigurálta egy adott szerződéshez tartozó csatorna-előállítót, meghívhatja azt a ChannelFactory<TChannel>.CreateChannel metódust, amellyel ügyfélcsatorna-objektumokat adhat vissza, amelyekkel kommunikálhat egy ISampleService szolgáltatással.

Létrehozásukkor az ügyfélcsatorna objektumai implementálva IClientChannel lesznek, és a szerződési felület is létrejön. Ezért közvetlenül is meghívhatja azokat a műveleteket, amelyek az adott szerződést támogató szolgáltatással kommunikálnak.

Az ügyfélobjektumok és az ügyfélcsatorna-objektumok használata közötti különbség csupán az egyik vezérlő és egyszerű használat a fejlesztők számára. Sok fejlesztő, aki kényelmesen dolgozik az osztályokkal és objektumokkal, inkább a WCF-ügyfélobjektumot használja a WCF-ügyfélcsatorna helyett.

Példa: Útmutató: A ChannelFactory használata.