Dela via


Utökar dispatchers

Dispatchers ansvarar för att hämta inkommande meddelanden från de underliggande kanalerna, översätta dem till metodanrop i programkod och skicka tillbaka resultaten till anroparen. Med Dispatcher-tillägg kan du ändra den här bearbetningen. Du kan implementera meddelande- eller parameterkontrollanter som inspekterar eller ändrar innehållet i meddelanden eller parametrar. Du kan ändra hur meddelanden dirigeras till åtgärder eller tillhandahålla andra funktioner.

I det här avsnittet beskrivs hur du använder DispatchRuntime klasserna och DispatchOperation i ett WCF-tjänstprogram (Windows Communication Foundation) för att ändra standardkörningsbeteendet för en dispatcher eller för att fånga upp eller ändra meddelanden, parametrar eller returnera värden före eller efter sändning eller hämtning av dem från kanalskiktet. Mer information om motsvarande klientkörningsmeddelandebearbetning finns i Utöka klienter. Information om vilken roll som IExtensibleObject<T> typer spelar vid åtkomst till delat tillstånd mellan olika körningsanpassningsobjekt finns i Extensible Objects(Extensible Objects).

Dispatchers

Tjänstmodelllagret utför konverteringen mellan utvecklarens programmeringsmodell och det underliggande meddelandeutbytet, som ofta kallas kanalskiktet. I WCF är kanal- och slutpunktsutskickarna (ChannelDispatcherEndpointDispatcherrespektive ) de tjänstkomponenter som ansvarar för att ta emot nya kanaler, ta emot meddelanden, driftssändning och anrop samt svarsbearbetning. Dispatcher-objekt är mottagarobjekt, men implementeringar av återanropskontrakt i duplex-tjänster exponerar även deras dispatcher-objekt för inspektion, ändring eller tillägg.

Kanalutskickaren (och tillhörande IChannelListener) hämtar meddelanden från underkanalen och skickar meddelandena till respektive slutpunktsutskickare. Varje slutpunktsutskickare har en DispatchRuntime som dirigerar meddelanden till lämplig DispatchOperation, som ansvarar för att anropa den metod som implementerar åtgärden. Olika valfria och obligatoriska tilläggsklasser anropas längs vägen. Det här avsnittet beskriver hur de här delarna passar ihop och hur du kan ändra egenskaper och ansluta din egen kod för att utöka basfunktionerna.

Dispatcher-egenskaper och ändrade anpassningsobjekt infogas med hjälp av tjänst-, slutpunkts-, kontrakts- eller åtgärdsbeteendeobjekt. Det här avsnittet beskriver inte hur du använder beteenden. Mer information om de typer som används för att infoga dispatcher-ändringar finns i Konfigurera och utöka körningen med beteenden.

Följande bild ger en översikt över arkitekturobjekten i en tjänst.

The dispatch runtime architecture

Kanalutskickare

Ett ChannelDispatcher objekt skapas för att associera en IChannelListener vid en viss URI (kallas en lyssnings-URI) med en instans av en tjänst. Varje ServiceHost objekt kan ha många ChannelDispatcher objekt, var och en associerad med endast en lyssnare och lyssnar-URI. När ett meddelande tas emot frågar var ChannelDispatcher och en av de associerade EndpointDispatcher objekten om slutpunkten kan acceptera meddelandet och skickar meddelandet till det som kan.

Alla egenskaper som styr livslängden och beteendet för en kanalsession är tillgängliga för inspektion eller ändring av ChannelDispatcher objektet. Dessa inkluderar anpassade kanalinitierare, kanallyssnaren, värden, tillhörande InstanceContextoch så vidare.

Slutpunktsutskickare

Objektet EndpointDispatcher ansvarar för att bearbeta meddelanden från en ChannelDispatcher när måladressen för ett meddelande matchar AddressFilter och meddelandeåtgärden matchar ContractFilter egenskapen. Om två EndpointDispatcher objekt kan acceptera ett meddelande FilterPriority avgör egenskapsvärdet slutpunkten med högre prioritet.

EndpointDispatcher Använd för att hämta de två huvudtjänstmodelltilläggspunkterna DispatchRuntime – klasserna och DispatchOperation – som du kan använda för att anpassa bearbetningen av avsändaren. Klassen DispatchRuntime gör det möjligt för användare att fånga upp och utöka avsändaren i kontraktsomfånget (d.s. för alla meddelanden i ett kontrakt). Klassen DispatchOperation gör det möjligt för användare att fånga upp och utöka avsändaren i ett åtgärdsomfång (d.s. för alla meddelanden i en åtgärd).

Scenarier

Det finns ett antal orsaker till att utöka avsändaren:

  • Validering av anpassat meddelande. Användare kan framtvinga att ett meddelande är giltigt för ett visst schema. Detta kan göras genom att implementera gränssnitten för meddelandeavlyssning. Ett exempel finns i Meddelandekontroll.

  • Anpassad meddelandeloggning. Användare kan inspektera och logga vissa uppsättning programmeddelanden som flödar via en slutpunkt. Detta kan också göras med gränssnitten för meddelandeavlyssning.

  • Anpassade meddelandetransformeringar. Användare kan tillämpa vissa transformeringar på meddelandet i körningen (till exempel för versionshantering). Detta kan göras igen med gränssnitten för meddelandeavlyssnare.

  • Anpassad datamodell. Användare kan ha en annan data serialiseringsmodell än de som stöds som standard i WCF (nämligen , System.Runtime.Serialization.DataContractSerializerSystem.Xml.Serialization.XmlSerializeroch rådatameddelanden). Detta kan göras genom att implementera gränssnitten för meddelandeformatering. Ett exempel finns i Åtgärdsformaterare och Åtgärdsväljare.

  • Validering av anpassad parameter. Användare kan framtvinga att inskrivna parametrar är giltiga (till skillnad från XML). Detta kan göras med hjälp av parameterkontrollgränssnitten.

  • Anpassad åtgärdsutskick. Användare kan implementera sändning på något annat än åtgärd – till exempel på brödtextelementet eller på en anpassad meddelandeegenskap. Detta kan göras med hjälp av IDispatchOperationSelector gränssnittet. Ett exempel finns i Åtgärdsformaterare och Åtgärdsväljare.

  • Objektpooler. Användare kan poolinstanser i stället för att allokera en ny för varje anrop. Detta kan implementeras med hjälp av instansproviderns gränssnitt. Ett exempel finns i Poolning.

  • Instansleasing. Användare kan implementera ett leasingmönster för instansens livslängd, ungefär som för .NET Framework-fjärrkommunikation. Detta kan göras med hjälp av instanskontextens livslängdsgränssnitt.

  • Anpassad felhantering. Användarna kan styra hur både lokala fel bearbetas och hur fel kommuniceras tillbaka till klienter. Detta kan implementeras med hjälp av gränssnitten IErrorHandler .

  • Anpassade auktoriseringsbeteenden. Användare kan implementera anpassad åtkomstkontroll genom att utöka körningsdelarna Kontrakt eller Åtgärd och lägga till säkerhetskontroller baserat på de token som finns i meddelandet. Detta kan åstadkommas med hjälp av antingen gränssnitten för meddelandeavlyssnare eller parameteravlyssning. Exempel finns i Utökningsbarhet för säkerhet.

    Varning

    Eftersom ändringar av säkerhetsegenskaper kan äventyra säkerheten för WCF-program rekommenderar vi starkt att du utför säkerhetsrelaterade ändringar med försiktighet och testar noggrant före distributionen.

  • Anpassade WCF Runtime-validatorer. Du kan installera anpassade validatorer som undersöker tjänster, kontrakt och bindningar för att tillämpa principer på företagsnivå med avseende på WCF-program. (Se till exempel Anvisningar: Låsa slutpunkter i Enterprise.)

Använda Klassen DispatchRuntime

DispatchRuntime Använd klassen antingen för att ändra standardbeteendet för en tjänst eller en enskild slutpunkt, eller för att infoga objekt som implementerar anpassade ändringar i en eller båda av följande tjänstprocesser (eller klientprocesser om det gäller en duplexklient):

  • Omvandlingen av inkommande meddelanden till objekt och frigöra dessa objekt som metodanrop på ett tjänstobjekt.

  • Omvandlingen av objekt som tagits emot från svaret på en tjänståtgärdsanrop till utgående meddelanden.

Gör DispatchRuntime att du kan fånga upp och utöka kanalen eller slutpunktsutskickaren för alla meddelanden i ett visst kontrakt, även när ett meddelande inte känns igen. När ett meddelande tas emot som inte matchar någon som deklarerats i kontraktet skickas det till den åtgärd som returneras av UnhandledDispatchOperation egenskapen. Information om hur du fångar upp eller utökar alla meddelanden för en viss åtgärd finns i DispatchOperation klassen .

Det finns fyra huvudområden för utökningsbarhet för dispatcher som exponeras av DispatchRuntime klassen:

  1. Kanalkomponenter använder egenskaperna för och egenskaperna DispatchRuntime för den associerade kanalutskickaren som returneras av ChannelDispatcher egenskapen för att anpassa hur kanalutskickaren accepterar och stänger kanaler. Den här kategorin innehåller ChannelInitializers egenskaperna och InputSessionShutdownHandlers .

  2. Meddelandekomponenter anpassas för varje bearbetat meddelande. Den här kategorin innehåller MessageInspectorsegenskaperna , OperationSelector, Operationsoch ErrorHandlers .

  3. Instanskomponenter anpassar skapande, livslängd och bortskaffande av instanser av tjänsttypen. Mer information om livslängden för tjänstobjekt finns i egenskapen InstanceContextMode . Den här kategorin innehåller InstanceContextInitializers egenskaperna och InstanceProvider .

  4. Säkerhetsrelaterade komponenter kan använda följande egenskaper:

Vanligtvis tilldelas anpassade tilläggsobjekt till en DispatchRuntime egenskap eller infogas i en samling av ett tjänstbeteende (ett objekt som implementerar IServiceBehavior), ett kontraktsbeteende (ett objekt som implementerar ) eller ett slutpunktsbeteende IContractBehavior(ett objekt som implementerar IEndpointBehavior). Sedan läggs installationsbeteendeobjektet till i lämplig samling beteenden antingen programmatiskt eller genom att implementera ett anpassat BehaviorExtensionElement objekt för att göra det möjligt att infoga beteendet med hjälp av en programkonfigurationsfil.

Duplex-klienter (klienter som implementerar ett återanropskontrakt som anges av en duplex-tjänst) har också ett DispatchRuntime objekt som kan nås med hjälp av CallbackDispatchRuntime egenskapen .

Använda klassen DispatchOperation

Klassen DispatchOperation är platsen för körningsändringar och insättningspunkten för anpassade tillägg som endast är begränsade till en tjänståtgärd. (Om du vill ändra körningsbeteendet för tjänsten för alla meddelanden i ett kontrakt använder du DispatchRuntime klassen.)

Installera DispatchOperation ändringar med hjälp av ett beteendeobjekt för anpassade tjänster.

Använd egenskapen Operations för att hitta objektet DispatchOperation som representerar en viss tjänståtgärd.

Följande egenskaper styr körningen av körningen på åtgärdsnivå:

Se även