Dela via


Skapa användardefinierade bindningar

Det finns flera sätt att skapa bindningar som inte tillhandahålls av systemet:

  • Skapa en anpassad bindning baserat på CustomBinding klassen, som är en container som du fyller med bindningselement. Den anpassade bindningen läggs sedan till i en tjänstslutpunkt. Du kan skapa den anpassade bindningen antingen programmatiskt eller i en programkonfigurationsfil. Om du vill använda ett bindningselement från en programkonfigurationsfil måste bindningselementet utöka BindingElementExtensionElement. Mer information om anpassade bindningar finns i Anpassade bindningar och CustomBinding.

  • Du kan skapa en klass som härleds från en standardbindning. Du kan till exempel härleda en klass från WSHttpBinding och åsidosätta CreateBindingElements metoden för att hämta bindningselementen och infoga ett anpassat bindningselement eller upprätta ett visst värde för säkerhet.

  • Du kan skapa en ny Binding typ för att helt styra hela bindningsimplementeringen.

Ordningen på bindningselement

Varje bindningselement representerar ett bearbetningssteg när meddelanden skickas eller tas emot. Vid körning skapar bindningselement de kanaler och lyssnare som behövs för att skapa utgående och inkommande kanalstackar.

Det finns tre huvudsakliga typer av bindningselement: Protokollbindningselement, Kodningsbindningselement och Transportbindningselement.

Protokollbindningselement – dessa element representerar bearbetningssteg på högre nivå som fungerar på meddelanden. Kanaler och lyssnare som skapats av dessa bindningselement kan lägga till, ta bort eller ändra meddelandeinnehållet. En viss bindning kan ha ett godtyckligt antal protokollbindningselement, var och en ärver från BindingElement. Windows Communication Foundation (WCF) innehåller flera protokollbindningselement, inklusive ReliableSessionBindingElement och SymmetricSecurityBindingElement.

Kodningsbindningselement – dessa element representerar transformeringar mellan ett meddelande och en kodning som är redo för överföring på tråden. Typiska WCF-bindningar innehåller exakt ett kodningsbindningselement. Exempel på kodningsbindningselement är MtomMessageEncodingBindingElement, BinaryMessageEncodingBindingElement, och TextMessageEncodingBindingElement. Om ett kodningsbindningselement inte har angetts för en bindning används en standardkodning. Standardvärdet är text när transporten är HTTP och binär på annat sätt.

Transportbindningselement – dessa element representerar överföringen av ett kodningsmeddelande i ett transportprotokoll. Vanliga WCF-bindningar innehåller exakt ett transportbindningselement, som ärver från TransportBindingElement. Exempel på transportbindningselement är TcpTransportBindingElement, HttpTransportBindingElement, och NamedPipeTransportBindingElement.

När du skapar nya bindningar är ordningen på de tillagda bindningselementen viktig. Lägg alltid till bindningselement i följande ordning:

Skikt Alternativ Obligatoriskt
Transaktionsflöde System.ServiceModel.Channels.TransactionFlowBindingElement Nej
Tillförlitlighet System.ServiceModel.Channels.ReliableSessionBindingElement Nej
Säkerhet System.ServiceModel.Channels.SecurityBindingElement Nej
Sammansatt duplex System.ServiceModel.Channels.CompositeDuplexBindingElement Nej
Encoding Text, Binär, MTOM, Anpassad Ja*
Transport TCP, med namnet Pipes, HTTP, HTTPS, MSMQ, Custom Ja

*Eftersom en kodning krävs för varje bindning, lägger WCF till en standardkodning åt dig om en kodning inte har angetts. Standardvärdet är Text/XML för HTTP- och HTTPS-transporterna och Binärt i övrigt.

Skapa ett nytt bindningselement

Förutom de typer som härleds från BindingElement som tillhandahålls av WCF kan du skapa egna bindningselement. På så sätt kan du anpassa hur stacken med bindningar skapas och de komponenter som ingår i den genom att skapa egna BindingElement som kan skapas med de andra systemspecifika typerna i stacken.

Om du till exempel implementerar en LoggingBindingElement som ger möjlighet att logga meddelandet till en databas måste du placera det ovanför en transportkanal i kanalstacken. I det här fallet skapar programmet en anpassad bindning som består av LoggingBindingElement med TcpTransportBindingElement, som i följande exempel.

Binding customBinding = new CustomBinding(  
  new LoggingBindingElement(),
  new TcpTransportBindingElement()  
);  

Hur du skriver ditt nya bindningselement beror på dess exakta funktioner. Ett av exemplen, Transport: UDP, innehåller en detaljerad beskrivning av hur du implementerar en typ av bindningselement.

Skapa en ny bindning

Ett bindningselement som skapats av användaren kan användas på två sätt. Föregående avsnitt illustrerar det första sättet: via en anpassad bindning. Med en anpassad bindning kan användaren skapa en egen bindning baserat på en godtycklig uppsättning bindningselement, inklusive användarskapade.

Om du använder bindningen i fler än ett program skapar du en egen bindning och utökar Binding. På så sätt undviker du att skapa en anpassad bindning manuellt varje gång du vill använda den. Med en användardefinierad bindning kan du definiera bindningens beteende och inkludera användardefinierade bindningselement. Och den är förpaketerad: du behöver inte återskapa bindningen varje gång du använder den.

En användardefinierad bindning måste minst implementera CreateBindingElements metoden och Scheme egenskapen.

Metoden CreateBindingElements returnerar en ny BindingElementCollection som innehåller bindningselementen för bindningen. Samlingen är ordnad och bör innehålla protokollbindningselementen först, följt av kodningsbindningselementet följt av transportbindningselementet. När du använder de bindningselement som tillhandahålls av WCF-systemet måste du följa de regler för bindningselementordning som anges i Anpassade bindningar. Den här samlingen bör aldrig referera till objekt som refereras i den användardefinierade bindningsklassen. Därför måste bindningsförfattare returnera en Clone() av anropen BindingElementCollection till CreateBindingElements.

Egenskapen Scheme representerar URI-schemat för transportprotokollet som används för bindningen. Till exempel returnerar WSHttpBinding och NetTcpBinding "http" och "net.tcp" från respektive Scheme egenskaper.

En fullständig lista över valfria metoder och egenskaper för användardefinierade bindningar finns i Binding.

Exempel

Det här exemplet implementerar profilbindning i SampleProfileUdpBinding, som härleds från Binding. Innehåller SampleProfileUdpBinding upp till fyra bindningselement i den: en användarskapad UdpTransportBindingElementoch tre systembaserade: TextMessageEncodingBindingElement, CompositeDuplexBindingElementoch ReliableSessionBindingElement.

public override BindingElementCollection CreateBindingElements()  
{
    BindingElementCollection bindingElements = new BindingElementCollection();  
    if (ReliableSessionEnabled)  
    {  
        bindingElements.Add(session);  
        bindingElements.Add(compositeDuplex);  
    }  
    bindingElements.Add(encoding);  
    bindingElements.Add(transport);  
    return bindingElements.Clone();  
}  

Säkerhetsbegränsningar med Duplex-kontrakt

Alla bindningselement är inte kompatibla med varandra. I synnerhet finns det vissa begränsningar för säkerhetsbindningselement när de används med duplexkontrakt.

Säkerhet med ett skott

Du kan implementera "one-shot"-säkerhet, där alla nödvändiga säkerhetsautentiseringsuppgifter skickas i ett enda meddelande, genom att ange negotiateServiceCredential attributet <för meddelandekonfigurationselementet> till false.

One-shot-autentisering fungerar inte med duplex-kontrakt.

För kontrakt med begärandesvar fungerar enstaka autentisering endast om bindningsstacken under säkerhetsbindningselementet stöder skapande IRequestChannel eller IRequestSessionChannel instanser.

För enkelriktade kontrakt fungerar one-shot-autentisering om bindningsstacken under säkerhetsbindningselementet har stöd för att skapa IRequestChannel, IRequestSessionChannelIOutputChannel eller IOutputSessionChannel instanser.

Säkerhetskontexttoken för cookieläge kan inte användas med duplexkontrakt.

För kontrakt för begärandesvar fungerar säkerhetskontexttoken i cookieläge endast om bindningsstacken under säkerhetsbindningselementet stöder skapande IRequestChannel eller IRequestSessionChannel instanser.

För enkelriktade kontrakt fungerar säkerhetskontexttoken i cookieläge om bindningsstacken under säkerhetsbindningselementet stöder skapande IRequestChannel eller IRequestSessionChannel instanser.

Säkerhetskontexttoken i sessionsläge

Sct för sessionsläge fungerar för duplex-kontrakt om bindningsstacken under säkerhetsbindningselementet stöder skapande IDuplexChannel eller IDuplexSessionChannel instanser.

Sct för sessionsläge fungerar för kontrakt för begärandesvar om bindningsstacken under säkerhetsbindningselementet stöder skapandet IDuplexChannelav IRequestChannel , IDuplexSessionChanneleller IRequestSessionChannel, instanser.

Sct för sessionsläge fungerar för 1-vägskontrakt om bindningsstacken under säkerhetsbindningselementet har stöd för att skapa IDuplexChannel, IDuplexSessionChannelIRequestChannel eller IRequestSessionChannel instanser.

Härleds från en standardbindning

I stället för att skapa en helt ny bindningsklass kan du utöka en av de befintliga bindningarna som tillhandahålls av systemet. Precis som i föregående fall måste du åsidosätta CreateBindingElements metoden och Scheme egenskapen.

Se även