Konfigurera bindningar för Windows Communication Foundation Services
När du skapar ett program vill du ofta skjuta upp beslut till administratören efter distributionen av programmet. Det finns till exempel ofta inget sätt att veta i förväg vad en tjänstadress eller URI (Uniform Resource Identifier) kommer att vara. I stället för att hårdkoda en adress är det bättre att låta en administratör göra det när en tjänst har skapats. Den här flexibiliteten uppnås genom konfiguration.
Kommentar
Använd verktyget ServiceModel Metadata Utility (Svcutil.exe) med växeln /config
för att snabbt skapa konfigurationsfiler.
Huvudavsnitt
Konfigurationsschemat för Windows Communication Foundation (WCF) innehåller följande tre huvudavsnitt (serviceModel
, bindings
och services
):
<configuration>
<system.serviceModel>
<bindings>
</bindings>
<services>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
ServiceModel-element
Du kan använda avsnittet som avgränsas av -elementet system.ServiceModel
för att konfigurera en tjänsttyp med en eller flera slutpunkter, samt inställningar för en tjänst. Varje slutpunkt kan sedan konfigureras med en adress, ett kontrakt och en bindning. Mer information om slutpunkter finns i Översikt över att skapa slutpunkter. Om inga slutpunkter anges lägger körningen till standardslutpunkter. Mer information om standardslutpunkter, bindningar och beteenden finns i Förenklad konfiguration och förenklad konfiguration för WCF-tjänster.
En bindning anger transporter (HTTP, TCP, pipes, Message Queuing) och protokoll (Säkerhet, Tillförlitlighet, Transaktionsflöden) och består av bindningselement, som var och en anger en aspekt av hur en slutpunkt kommunicerar med världen.
Om du till exempel anger elementet <basicHttpBinding> anger du att HTTP ska användas som transport för en slutpunkt. Detta används för att koppla slutpunkten vid körning när tjänsten som använder den här slutpunkten öppnas.
Det finns två typer av bindningar: fördefinierade och anpassade. Fördefinierade bindningar innehåller användbara kombinationer av element som används i vanliga scenarier. En lista över fördefinierade bindningstyper som tillhandahålls av WCF finns i System-provided Bindings (System-tillhandahållna bindningar). Om ingen fördefinierad bindningssamling har rätt kombination av funktioner som ett tjänstprogram behöver, kan du skapa anpassade bindningar för att uppfylla programmets krav. Mer information om anpassade bindningar finns i customBinding>.<
Följande fyra exempel illustrerar de vanligaste bindningskonfigurationerna som används för att konfigurera en WCF-tjänst.
Ange en slutpunkt som ska använda en bindningstyp
Det första exemplet visar hur du anger en slutpunkt som konfigurerats med en adress, ett kontrakt och en bindning.
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<!-- This section is optional with the default configuration introduced
in .NET Framework 4. -->
<endpoint
address="/HelloWorld2/"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
I det här exemplet name
anger attributet vilken tjänsttyp konfigurationen är till för. När du skapar en tjänst i koden med kontraktet initieras den HelloWorld
med alla slutpunkter som definierats i exempelkonfigurationen. Om sammansättningen bara implementerar ett tjänstkontrakt name
kan attributet utelämnas eftersom tjänsten använder den enda tillgängliga typen. Attributet tar en sträng som måste vara i formatet Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
Attributet address
anger den URI som andra slutpunkter använder för att kommunicera med tjänsten. URI:n kan vara antingen en absolut eller relativ sökväg. Om en relativ adress anges förväntas värden ange en basadress som är lämplig för det transportschema som används i bindningen. Om en adress inte har konfigurerats antas basadressen vara adressen för slutpunkten.
Attributet contract
anger vilket kontrakt den här slutpunkten exponeras för. Tjänstimplementeringstypen måste implementera kontraktstypen. Om en tjänstimplementering implementerar en enda kontraktstyp kan den här egenskapen utelämnas.
Attributet binding
väljer en fördefinierad eller anpassad bindning som ska användas för den här specifika slutpunkten. En slutpunkt som inte uttryckligen väljer en bindning använder standardbindningsvalet, som är BasicHttpBinding
.
Ändra en fördefinierad bindning
I följande exempel ändras en fördefinierad bindning. Den kan sedan användas för att konfigurera valfri slutpunkt i tjänsten. Bindningen ändras genom att värdet anges ReceiveTimeout till 1 sekund. Observera att egenskapen returnerar ett TimeSpan objekt.
Den ändrade bindningen finns i avsnittet bindningar. Den här ändrade bindningen kan nu användas när du skapar en slutpunkt genom att ange binding
attributet i elementet endpoint
.
Kommentar
Om du ger bindningen ett visst namn måste den bindingConfiguration
som anges i tjänstslutpunkten matcha med den.
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="/HelloWorld2/"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
<bindings>
<basicHttpBinding
receiveTimeout="00:00:01"
/>
</bindings>
Konfigurera ett beteende för att tillämpa på en tjänst
I följande exempel konfigureras ett specifikt beteende för tjänsttypen. Elementet ServiceMetadataBehavior
används för att göra det möjligt för ServiceModel Metadata Utility Tool (Svcutil.exe) att köra frågor mot tjänsten och generera WSDL-dokument (Web Services Description Language) från metadata.
Kommentar
Om du ger beteendet ett visst namn måste det behaviorConfiguration
som anges i avsnittet tjänst eller slutpunkt matcha det.
<behaviors>
<behavior>
<ServiceMetadata httpGetEnabled="true" />
</behavior>
</behaviors>
<services>
<service
name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="http://computer:8080/Hello"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</service>
</services>
Den föregående konfigurationen gör det möjligt för en klient att anropa och hämta metadata för den "HelloWorld"-typerade tjänsten.
svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl
Ange en tjänst med två slutpunkter med olika bindningsvärden
I det sista exemplet konfigureras två slutpunkter för HelloWorld
tjänsttypen. Varje slutpunkt använder ett annat anpassat bindingConfiguration
attribut av samma bindningstyp (var och en ändrar basicHttpBinding
).
<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
<endpoint
address="http://computer:8080/Hello1"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="shortTimeout" />
<endpoint
address="http://computer:8080/Hello2"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="Secure" />
</service>
<bindings>
<basicHttpBinding
name="shortTimeout"
timeout="00:00:00:01"
/>
<basicHttpBinding
name="Secure">
<Security mode="Transport" />
</basicHttpBinding>
</bindings>
Du kan få samma beteende med hjälp av standardkonfigurationen genom att lägga till ett protocolMapping
avsnitt och konfigurera bindningarna enligt vad som visas i följande exempel.
<protocolMapping>
<add scheme="http" binding="basicHttpBinding" bindingConfiguration="shortTimeout" />
<add scheme="https" binding="basicHttpBinding" bindingConfiguration="Secure" />
</protocolMapping>
<bindings>
<basicHttpBinding
name="shortTimeout"
timeout="00:00:00:01"
/>
<basicHttpBinding
name="Secure" />
<Security mode="Transport" />
</bindings>