Dela via


Klientarkitektur

Program använder WCF-klientobjekt (Windows Communication Foundation) för att anropa tjänståtgärder. I det här avsnittet beskrivs WCF-klientobjekt, WCF-klientkanaler och deras relationer till den underliggande kanalarkitekturen. En grundläggande översikt över WCF-klientobjekt finns i Översikt över WCF-klient. Mer information om kanallagret finns i Utöka kanallagret.

Översikt

Körningstiden för tjänstmodellen skapar WCF-klienter som består av följande:

  • En automatiskt genererad klientimplementering av ett tjänstkontrakt som omvandlar anrop från programkoden till utgående meddelanden och omvandlar svarsmeddelanden till utdataparametrar och returnerar värden som programmet kan hämta.

  • En implementering av ett kontrollgränssnitt (System.ServiceModel.IClientChannel) som grupperar olika gränssnitt och ger åtkomst till kontrollfunktioner, framför allt möjligheten att stänga klientsessionen och ta bort kanalen.

  • En klientkanal som bygger på de konfigurationsinställningar som anges av den använda bindningen.

Program kan skapa sådana klienter på begäran, antingen via en System.ServiceModel.ChannelFactory eller genom att skapa en instans av en ClientBase<TChannel> härledd klass eftersom den genereras av ServiceModel Metadata Utility Tool (Svcutil.exe). Dessa färdiga klientklasser kapslar in och delegerar till en klientkanalimplementering som konstrueras dynamiskt av en ChannelFactory. Därför är klientkanalen och kanalfabriken som producerar dem i fokus för den här diskussionen.

Klientobjekt och klientkanaler

Basgränssnittet för WCF-klienter är System.ServiceModel.IClientChannel gränssnittet, som exponerar grundläggande klientfunktioner samt de grundläggande kommunikationsobjektfunktionerna System.ServiceModel.ICommunicationObjecti , kontextfunktionerna System.ServiceModel.IContextChanneli och det utökningsbara beteendet för System.ServiceModel.IExtensibleObject<T>.

Gränssnittet IClientChannel definierar dock inte själva tjänstkontraktet. Dessa deklareras av tjänstkontraktsgränssnittet (genereras vanligtvis från tjänstmetadata med hjälp av ett verktyg som ServiceModel Metadata Utility Tool (Svcutil.exe)). WCF-klienttyper utökar både IClientChannel och måltjänstkontraktsgränssnittet så att program kan anropa åtgärder direkt och även ha åtkomst till körningsfunktioner på klientsidan. Om du skapar en WCF-klient får WCF-objektSystem.ServiceModel.ChannelFactory den information som krävs för att skapa en körningstid som kan ansluta och interagera med den konfigurerade tjänstslutpunkten.

Som tidigare nämnts måste de två WCF-klienttyperna konfigureras innan du kan använda dem. De enklaste WCF-klienttyperna är objekt som härleds från ClientBase<TChannel> (eller DuplexClientBase<TChannel> om tjänstkontraktet är ett duplex-kontrakt). Du kan skapa dessa typer med hjälp av en konstruktor, konfigurerad programmatiskt eller med hjälp av en konfigurationsfil och sedan anropa direkt för att anropa tjänståtgärder. En grundläggande översikt över objekt finns i Översikt över ClientBase<TChannel>WCF-klient.

Den andra typen genereras vid körning från ett anrop till CreateChannel metoden. Program som har noggrann kontroll över kommunikationsinformationen använder vanligtvis den här klienttypen, som kallas för ett klientkanalobjekt, eftersom det möjliggör mer direkt interaktion än det underliggande klientkörnings- och kanalsystemet.

Kanalfabriker

Klassen som ansvarar för att skapa den underliggande körningstiden som stöder klientanrop är System.ServiceModel.ChannelFactory<TChannel> klassen. Både WCF-klientobjekt och WCF-klientkanalobjekt använder ett ChannelFactory<TChannel> objekt för att skapa instanser. Det ClientBase<TChannel> härledda klientobjektet kapslar in hanteringen av kanalfabriken, men för ett antal scenarier är det helt rimligt att använda kanalfabriken direkt. Det vanliga scenariot för detta är om du upprepade gånger vill skapa nya klientkanaler från en befintlig fabrik. Om du använder ett klientobjekt kan du hämta den underliggande kanalfabriken från ett WCF-klientobjekt genom att anropa ClientBase<TChannel>.ChannelFactory egenskapen.

Det viktiga att komma ihåg om kanalfabriker är att de skapar nya instanser av klientkanaler för konfigurationen som tillhandahålls till dem innan de anropar ChannelFactory<TChannel>.CreateChannel. När du anropar CreateChannel (eller ClientBase<TChannel>.Open, ClientBase<TChannel>.CreateChanneleller någon åtgärd på ett WCF-klientobjekt) kan du inte ändra kanalfabriken och förvänta dig att få kanaler till olika tjänstinstanser, även om du bara ändrar målslutpunktsadressen. Om du vill skapa ett klientobjekt eller en annan klientkanal med en annan konfiguration måste du först skapa en ny kanalfabrik.

Mer information om olika problem med WCF-klientobjekt och WCF-klientkanaler finns i Åtkomst till tjänster med hjälp av en WCF-klient.

I följande två avsnitt beskrivs hur WCF-klientkanalobjekt skapas och används.

Skapa ett nytt WCF-klientkanalobjekt

Anta att följande tjänstkontrakt har genererats för att illustrera användningen av en klientkanal.

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

Om du vill ansluta till en ISampleService tjänst använder du det genererade kontraktsgränssnittet direkt med en kanalfabrik (ChannelFactory<TChannel>). När du har skapat och konfigurerat en kanalfabrik för ett visst kontrakt kan du anropa CreateChannel metoden för att returnera klientkanalobjekt som du kan använda för att kommunicera med en ISampleService tjänst.

När du använder ChannelFactory<TChannel> klassen med ett tjänstkontraktsgränssnitt måste du skicka till IClientChannel gränssnittet för att uttryckligen öppna, stänga eller avbryta kanalen. För att göra det enklare att arbeta med genererar verktyget Svcutil.exe också ett hjälpgränssnitt som implementerar både tjänstkontraktsgränssnittet och IClientChannel gör det möjligt att interagera med klientkanalinfrastrukturen utan att behöva casta. Följande kod visar definitionen av en hjälpklientkanal som implementerar det föregående tjänstkontraktet.

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

Skapa ett nytt WCF-klientkanalobjekt

Om du vill använda en klientkanal för att ansluta till en ISampleService tjänst använder du det genererade kontraktsgränssnittet (eller hjälpversionen) direkt med en kanalfabrik och skickar typen av kontraktsgränssnitt som typparameter. När en kanalfabrik för ett visst kontrakt har skapats och konfigurerats kan du anropa ChannelFactory<TChannel>.CreateChannel metoden för att returnera klientkanalobjekt som du kan använda för att kommunicera med en ISampleService tjänst.

När de skapas implementerar IClientChannel klientkanalobjekten och kontraktsgränssnittet. Därför kan du använda dem direkt för att anropa åtgärder som interagerar med en tjänst som stöder kontraktet.

Skillnaden mellan att använda klientobjekt och klientkanalobjekt är bara kontroll och användarvänlighet för utvecklare. Många utvecklare som är bekväma med att arbeta med klasser och objekt föredrar att använda WCF-klientobjektet i stället för WCF-klientkanalen.

Ett exempel finns i Så här använder du ChannelFactory.