Kontrollera resursförbrukning och förbättra prestanda
Det här avsnittet beskriver olika egenskaper inom olika områden i WCF-arkitekturen (Windows Communication Foundation) som fungerar för att styra resursförbrukningen och påverka prestandamått.
Egenskaper som begränsar resursförbrukning i WCF
Windows Communication Foundation (WCF) tillämpar begränsningar för vissa typer av processer i säkerhets- eller prestandasyfte. Dessa begränsningar finns i två huvudformer, antingen kvoter och begränsningar. Kvoter är gränser som när de nås eller överskrids utlöser ett omedelbart undantag någon gång i systemet. Begränsningar är gränser som inte omedelbart orsakar ett undantagsfel. När en begränsningsgräns nås fortsätter bearbetningen i stället, men inom de gränser som anges av det begränsningsvärdet. Den här begränsade bearbetningen kan utlösa ett undantag någon annanstans, men detta beror på programmet.
Förutom skillnaden mellan kvoter och begränsningar finns vissa begränsande egenskaper på serialiseringsnivå, vissa på transportnivå och vissa på programnivå. Till exempel är kvoten TransportBindingElement.MaxReceivedMessageSize, som implementeras av alla transportbindningselement som tillhandahålls av systemet, inställd på 65 536 byte som standard för att hindra skadliga klienter från att utföra överbelastningsattacker mot en tjänst genom att orsaka överdriven minnesförbrukning. (Vanligtvis kan du öka prestandan genom att sänka det här värdet.)
Ett exempel på en serialiseringskvot är DataContractSerializer.MaxItemsInObjectGraph egenskapen, som anger det maximala antalet objekt som serialiseraren serialiserar eller deserialiserar i ett enda ReadObject metodanrop. Ett exempel på en begränsning på programnivå är ServiceThrottle.MaxConcurrentSessions egenskapen, som som standard begränsar antalet samtidiga sessionskänsliga kanalanslutningar till 10. (Till skillnad från kvoterna fortsätter programmet att bearbetas, men accepterar inga nya sessionskänsliga kanaler, vilket innebär att nya klienter inte kan ansluta förrän någon av de andra sessionskänsliga kanalerna har avslutats.)
Dessa kontroller är utformade för att ge en out-of-the-box-åtgärd mot vissa typer av attacker eller för att förbättra prestandamått som minnesfotavtryck, starttid och så vidare. Beroende på programmet kan dessa kontroller dock hindra prestanda för tjänstprogram eller hindra programmet från att fungera alls. Ett program som är utformat för att strömma video kan till exempel enkelt överskrida standardegenskapen TransportBindingElement.MaxReceivedMessageSize . Det här avsnittet innehåller en översikt över de olika kontroller som tillämpas på program på alla nivåer i WCF, beskriver olika sätt att få mer information om huruvida en inställning hindrar ditt program och beskriver olika sätt att åtgärda olika problem. De flesta begränsningar och vissa kvoter är tillgängliga på programnivå, även om basegenskapen är en serialisering eller transportbegränsning. Du kan till exempel ange DataContractSerializer.MaxItemsInObjectGraph egenskapen med hjälp av ServiceBehaviorAttribute.MaxItemsInObjectGraph egenskapen i tjänstklassen.
Kommentar
Om du har ett visst problem bör du först läsa snabbstarten för felsökning av WCF för att se om problemet (och en lösning) visas där.
Egenskaper som begränsar serialiseringsprocesser visas i Säkerhetsöverväganden för data. Egenskaper som begränsar förbrukningen av resurser som är relaterade till transporter visas i Transportkvoter. Egenskaper som begränsar förbrukningen av resurser på programlagret är medlemmar i ServiceThrottle klassen.
Identifiera program- och prestandaproblem som rör kvot-Inställningar
Standardvärdena för ovanstående värden har valts för att aktivera grundläggande programfunktioner i en mängd olika programtyper samtidigt som du ger grundläggande skydd mot vanliga säkerhetsproblem. Olika programdesign kan dock överskrida en eller flera begränsningsinställningar, även om programmet annars är säkert och fungerar som det ska. I dessa fall måste du identifiera vilka begränsningsvärden som överskrids och på vilken nivå och besluta om lämpliga åtgärder för att öka programmets dataflöde.
När du skriver programmet och felsöker det anger ServiceDebugBehavior.IncludeExceptionDetailInFaults du vanligtvis egenskapen till true
i konfigurationsfilen eller programmatiskt. Detta instruerar WCF att returnera tjänstfelsstackspårningar till klientprogrammet för visning. Den här funktionen rapporterar de flesta undantag på programnivå på ett sätt som visar vilka kvotinställningar som kan vara inblandade, om det är problemet.
Vissa undantag inträffar vid körning under synligheten för programskiktet och returneras inte med den här mekanismen, och de kanske inte hanteras av en anpassad System.ServiceModel.Dispatcher.IErrorHandler implementering. Om du befinner dig i en utvecklingsmiljö som Microsoft Visual Studio visas de flesta av dessa undantag automatiskt. Vissa undantag kan dock maskeras av inställningar för utvecklingsmiljön, till exempel Just My Code Visual Studio.
Oavsett funktionerna i utvecklingsmiljön kan du använda funktionerna för WCF-spårning och meddelandeloggning för att felsöka alla undantag och justera prestanda för dina program. Mer information finns i Använda spårning för att felsöka ditt program.
Prestandaproblem och XmlSerializer
Tjänster och klientprogram som använder datatyper som är serialiserbara med hjälp av XmlSerializer generera och kompilera serialiseringskod för dessa datatyper vid körning, vilket kan leda till långsamma startprestanda.
Kommentar
Förgenererad serialiseringskod kan endast användas i klientprogram och inte i tjänster.
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.
Prestandaproblem vid värdhantering av WCF-tjänster under ASP.NET
När en WCF-tjänst finns under IIS och ASP.NET kan konfigurationsinställningarna för IIS och ASP.NET påverka WCF-tjänstens dataflöde och minnesfotavtryck. Mer information om ASP.NET prestanda finns i Förbättra ASP.NET prestanda. En inställning som kan få oavsiktliga konsekvenser är MinWorkerThreads, som är en egenskap för ProcessModelSection. Om programmet har ett fast eller litet antal klienter kan inställningen MinWorkerThreads till 2 ge en ökning av dataflödet på en dator med flera processorer som har en processoranvändning nära 100 %. Den här prestandaökningen medför en kostnad: det kommer också att orsaka en ökning av minnesanvändningen, vilket kan minska skalbarheten.