Dela via


Klientprogram på mellannivå

I det här avsnittet beskrivs olika problem som är specifika för klientprogram på mellannivå som använder Windows Communication Foundation (WCF).

Öka klientprestanda på mellannivå

Jämfört med tidigare kommunikationstekniker, till exempel webbtjänster som använder ASP.NET, kan skapandet av en WCF-klientinstans vara mer komplex på grund av den omfattande funktionsuppsättningen för WCF. När ett ChannelFactory<TChannel> objekt öppnas kan det till exempel upprätta en säker session med tjänsten, en procedur som ökar starttiden för klientinstansen. Dessa ytterligare funktionsfunktioner påverkar vanligtvis inte klientprogram särskilt mycket eftersom WCF-klienten gör flera anrop och sedan stängs.

Klientprogram på mellannivå kan dock snabbt skapa många WCF-klientobjekt och därmed uppleva ökade initieringskrav. Det finns två huvudsakliga metoder för att öka prestandan för mellannivåprogram när du anropar tjänster:

  • Cachelagrade WCF-klientobjektet och återanvänd det för efterföljande anrop där det är möjligt.

  • Skapa ett ChannelFactory<TChannel> objekt och använd sedan objektet för att skapa nya WCF-klientkanalobjekt för varje anrop.

Problem att tänka på när du använder dessa metoder är:

  • Om tjänsten upprätthåller ett klientspecifikt tillstånd med hjälp av en session kan du inte återanvända WCF-klienten på mellannivå med begäranden på flera klientnivåer eftersom tjänstens tillstånd är kopplat till mellannivåklientens tillstånd.

  • Om tjänsten måste utföra autentisering per klient måste du skapa en ny klient för varje inkommande begäran på mellannivån i stället för att återanvända WCF-klienten på mellannivå (eller WCF-klientkanalobjektet) eftersom klientautentiseringsuppgifterna för mellannivån inte kan ändras när WCF-klienten (eller ChannelFactory<TChannel>) har skapats.

  • Även om kanaler och klienter som skapats av kanalerna är trådsäkra kanske de inte stöder att fler än ett meddelande skrivs till tråden samtidigt. Om du skickar stora meddelanden, särskilt om du strömmar, kan sändningsåtgärden blockera väntan på att en annan sändning ska slutföras. Detta orsakar två typer av problem: brist på samtidighet och risken för dödläge om kontrollflödet återgår till den tjänst som återanvänder kanalen (det vill säga den delade klienten anropar en tjänst vars kodsökväg resulterar i ett återanrop till den delade klienten). Detta gäller oavsett vilken typ av WCF-klient du återanvänder.

  • Du måste hantera felaktiga kanaler oavsett om du delar kanalen. När kanaler återanvänds kan dock en felkanal ta bort mer än en väntande begäran eller skicka.

Ett exempel som visar metodtips för att återanvända en klient för flera begäranden finns i Databindning i en ASP.NET-klient.

Dessutom kan du öka startprestandan för de klienter som använder datatyper som kan serialiseras med hjälp av XmlSerializer koden för att generera och kompilera serialisering för dessa datatyper vid körning, vilket kan leda till långsamma startprestanda. Verktyget servicemodelmetadata (Svcutil.exe) kan förbättra startprestanda för dessa program genom att generera nödvändig serialiseringskod från de kompilerade sammansättningarna för programmet. Mer information finns i Så här: Förbättra starttiden för WCF-klientprogram med hjälp av XmlSerializer.

Se även