Skapa ett BindingElement
Bindningar och bindningselement (objekt som utökas System.ServiceModel.Channels.BindingSystem.ServiceModel.Channels.BindingElementrespektive) är den plats där WCF-programmodellen (Windows Communication Foundation) är associerad med kanalfabriker och kanallyssnare. Utan bindningar kräver användning av anpassade kanaler programmering på kanalnivå enligt beskrivningen i Programmering på servicekanalnivå och Programmering på klientkanalnivå. I det här avsnittet beskrivs minimikravet för att aktivera användning av din kanal i WCF, utveckling av en BindingElement för din kanal och aktivering av användning från programmet enligt beskrivningen i steg 4 i Utveckla kanaler.
Översikt
Genom att skapa en BindingElement för din kanal kan utvecklare använda den i ett WCF-program. BindingElement objekt kan användas från System.ServiceModel.ServiceHost klassen för att ansluta ett WCF-program till din kanal utan att behöva ange exakt typinformation för kanalen.
När en BindingElement har skapats kan du aktivera fler funktioner beroende på dina krav genom att följa de återstående kanalutvecklingsstegen som beskrivs i Utveckla kanaler.
Lägga till ett bindningselement
Om du vill implementera en anpassad BindingElementskriver du en klass som ärver från BindingElement. Om du till exempel har utvecklat en ChunkingChannel
som kan dela upp stora meddelanden i segment och sätta ihop dem igen i andra änden kan du använda den här kanalen i valfri bindning genom att implementera en BindingElement och konfigurera bindningen så att den används. Resten av det här avsnittet använder ChunkingChannel
som exempel för att demonstrera kraven för att implementera ett bindningselement.
A ChunkingBindingElement
ansvarar för att skapa ChunkingChannelFactory
och ChunkingChannelListener
. Den åsidosätter CanBuildChannelFactory och CanBuildChannelListener implementerar och kontrollerar att typparametern är IDuplexSessionChannel (i vårt exempel är detta den enda kanalformen ChunkingChannel
som stöds av ) och att de andra bindningselementen i bindningen stöder den här kanalformen.
BuildChannelFactory kontrollerar först att den begärda kanalformen kan skapas och hämtar sedan en lista över meddelandeåtgärder som ska segmenteras. Sedan skapas en ny ChunkingChannelFactory
, som skickar den till den inre kanalfabriken. (Om du skapar ett transportbindningselement är det elementet det sista i bindningsstacken och måste därför skapa en kanallyssnare eller kanalfabrik.)
BuildChannelListener har en liknande implementering för att skapa ChunkingChannelListener
och skicka den till den inre kanalens lyssnare.
Som ett annat exempel med en transportkanal tillhandahåller exemplet Transport: UDP följande åsidosättning.
I exemplet är UdpTransportBindingElement
bindningselementet , som härleds från TransportBindingElement. Den åsidosätter följande metoder för att skapa de fabriker som är associerade med kanalen.
public IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
return (IChannelFactory<TChannel>)(object)new UdpChannelFactory(this, context);
}
public IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
{
return (IChannelListener<TChannel>)(object)new UdpChannelListener(this, context);
}
Den innehåller också medlemmar för att klona BindingElement
och returnera vårt schema (soap.udp).
Protokollbindningselement
Nya bindningselement kan ersätta eller utöka något av de inkluderade bindningselementen, lägga till nya transporter, kodningar eller protokoll på högre nivå. Om du vill skapa ett nytt protokollbindningselement börjar du med att BindingElement utöka klassen. Du måste minst implementera BindingElement.Clone och implementera med hjälp av ChannelProtectionRequirements
IChannel.GetProperty. Detta returnerar ChannelProtectionRequirements för det här bindningselementet. Mer information finns i ChannelProtectionRequirements.
Clone ska returnera en ny kopia av det här bindningselementet. Som bästa praxis rekommenderar vi att bindningselementförfattare implementerar Clone med hjälp av en kopieringskonstruktor som anropar baskopieringskonstruktorn och sedan klonar eventuella ytterligare fält i den här klassen.
Transportbindningselement
Om du vill skapa ett nytt transportbindningselement utökar du TransportBindingElement gränssnittet. Du måste minst implementera Clone metoden och TransportBindingElement.Scheme egenskapen.
Clone – Ska returnera en ny kopia av det här bindningselementet. Som bästa praxis rekommenderar vi att Bindningselementförfattare implementerar Clone via en kopieringskonstruktor som anropar baskopieringskonstruktorn och sedan klonar eventuella ytterligare fält i den här klassen.
Scheme – Get-egenskapen Scheme returnerar URI-schemat för transportprotokollet som representeras av bindningselementet. Till exempel System.ServiceModel.Channels.HttpTransportBindingElement returnerar och System.ServiceModel.Channels.TcpTransportBindingElement "http" och "net.tcp" från respektive Scheme egenskaper.
Kodning av bindningselement
Om du vill skapa nya kodningsbindningselement börjar du med att BindingElement utöka klassen och implementera System.ServiceModel.Channels.MessageEncodingBindingElement klassen. Du måste minst implementera Clonemetoderna , MessageEncodingBindingElement.CreateMessageEncoderFactory och egenskapen MessageEncodingBindingElement.MessageVersion .
Clone. Returnerar en ny kopia av det här bindningselementet. Som bästa praxis rekommenderar vi att bindningselementförfattare implementerar Clone med hjälp av en kopieringskonstruktor som anropar baskopieringskonstruktorn och sedan klonar eventuella ytterligare fält i den här klassen.
CreateMessageEncoderFactory. Returnerar en MessageEncoderFactory, som ger en referens till den faktiska klassen som implementerar din nya kodare och som ska utöka MessageEncoder. Mer information finns i MessageEncoderFactory och MessageEncoder.
MessageVersion. Returnerar den MessageVersion som används i den här kodningen, som representerar de versioner av SOAP och WS-Addressing som används.
En fullständig lista över valfria metoder och egenskaper för användardefinierade kodningsbindningselement finns i MessageEncodingBindingElement.
Mer information om hur du skapar ett nytt bindningselement finns i Skapa användardefinierade bindningar.
När du har skapat ett bindningselement för kanalen går du tillbaka till avsnittet Utveckla kanaler för att se om du vill lägga till konfigurationsfilstöd för bindningselementet, om och hur du lägger till stöd för metadatapublikation och om och hur du skapar en användardefinierad bindning som använder bindningselementet.