Så här gör du: Exchange-meddelanden i en tillförlitlig session
Det här avsnittet beskriver de steg som krävs för att aktivera en tillförlitlig session med hjälp av en av de bindningar som tillhandahålls av systemet som stöder en sådan session, men inte som standard. Du aktiverar en tillförlitlig session med hjälp av kod eller deklarativt i konfigurationsfilen. Den här proceduren använder klient- och tjänstkonfigurationsfilerna för att aktivera den tillförlitliga sessionen och för att ange att meddelandena kommer i samma ordning som de skickades.
Den viktigaste delen av den här proceduren är att slutpunktskonfigurationselementet innehåller ett bindingConfiguration
attribut som refererar till en bindningskonfiguration med namnet Binding1
. Bindningskonfigurationselementet <>refererar till det här namnet för att aktivera tillförlitliga sessioner genom att ange enabled
attributet för elementet< reliableSession> till .true
Du anger de beställda leveransgarantierna för den tillförlitliga sessionen genom att ange ordered
attributet till true
.
För källkopian av det här exemplet, se WS Reliable Session.
Konfigurera tjänsten med en WSHttpBinding för att använda en tillförlitlig session
Definiera ett tjänstkontrakt för typen av tjänst.
[ServiceContract] public interface ICalculator { [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); }
Implementera tjänstkontraktet i en tjänstklass. Observera att adress- eller bindningsinformationen inte anges i implementeringen av tjänsten. Du behöver inte skriva kod för att hämta adress- eller bindningsinformationen från konfigurationsfilen.
public class CalculatorService : ICalculator { public double Add(double n1, double n2) { return n1 + n2; } public double Subtract(double n1, double n2) { return n1 - n2; } public double Multiply(double n1, double n2) { return n1 * n2; } public double Divide(double n1, double n2) { return n1 / n2; } }
Skapa en Web.config-fil för att konfigurera en slutpunkt för den
CalculatorService
som använder WSHttpBinding med tillförlitlig session aktiverad och ordnad leverans av meddelanden som krävs.<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.CalculatorService"> <!-- This endpoint is exposed at the base address provided by host: http://localhost/servicemodelsamples/service.svc Specify wsHttpBinding binding and a binding configuration to use --> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Binding1" contract="Microsoft.ServiceModel.Samples.ICalculator" /> <!-- The mex endpoint is exposed at http://localhost/servicemodelsamples/service.svc/mex --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <!-- Configures WSHttpBinding for reliable sessions with ordered delivery. --> <bindings> <wsHttpBinding> <binding name="Binding1"> <reliableSession enabled="true" ordered="true" /> </binding> </wsHttpBinding> </bindings> </system.serviceModel> </configuration>
Skapa en Service.svc-fil som innehåller raden:
<%@ServiceHost language=c# Service="CalculatorService" %>
Placera filen Service.svc i din virtuella IIS-katalog (Internet Information Services).
Konfigurera klienten med en WSHttpBinding för att använda en tillförlitlig session
Använd verktygsverktyget för ServiceModel-metadata (Svcutil.exe) från kommandoraden för att generera kod från tjänstmetadata:
Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
Den genererade klienten innehåller det
ICalculator
gränssnitt som definierar det tjänstkontrakt som klientimplementeringen måste uppfylla.//Generated interface defining the ICalculator contract [System.ServiceModel.ServiceContractAttribute( Namespace="http://Microsoft.ServiceModel.Samples", ConfigurationName="Microsoft.ServiceModel.Samples.ICalculator")] public interface ICalculator { [System.ServiceModel.OperationContractAttribute( Action="http://Microsoft.ServiceModel.Samples/ICalculator/Add", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse")] double Add(double n1, double n2); [System.ServiceModel.OperationContractAttribute( Action="http://Microsoft.ServiceModel.Samples/ICalculator/Subtract", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/SubtractResponse")] double Subtract(double n1, double n2); [System.ServiceModel.OperationContractAttribute( Action="http://Microsoft.ServiceModel.Samples/ICalculator/Multiply", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/MultiplyResponse")] double Multiply(double n1, double n2); [System.ServiceModel.OperationContractAttribute( Action="http://Microsoft.ServiceModel.Samples/ICalculator/Divide", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/DivideResponse")] double Divide(double n1, double n2); }
Det genererade klientprogrammet innehåller även implementeringen av
ClientCalculator
. Observera att adress- och bindningsinformationen inte anges någonstans i implementeringen av tjänsten. Du behöver inte skriva kod för att hämta adress- eller bindningsinformationen från konfigurationsfilen.// Implementation of the CalculatorClient public partial class CalculatorClient : System.ServiceModel.ClientBase<Microsoft.ServiceModel.Samples.ICalculator>, Microsoft.ServiceModel.Samples.ICalculator { public CalculatorClient() { } public CalculatorClient(string endpointConfigurationName) : base(endpointConfigurationName) { } public CalculatorClient(string endpointConfigurationName, string remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public CalculatorClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public CalculatorClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : base(binding, remoteAddress) { } public double Add(double n1, double n2) { return base.Channel.Add(n1, n2); } public double Subtract(double n1, double n2) { return base.Channel.Subtract(n1, n2); } public double Multiply(double n1, double n2) { return base.Channel.Multiply(n1, n2); } public double Divide(double n1, double n2) { return base.Channel.Divide(n1, n2); } }
Svcutil.exe genererar också konfigurationen för klienten som använder WSHttpBinding klassen. Ge konfigurationsfilen namnet App.config när du använder Visual Studio.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <client> <!-- Specify wsHttpBinding binding and a binding configuration to use --> <endpoint address="http://localhost/servicemodelsamples/service.svc" binding="wsHttpBinding" bindingConfiguration="Binding1" contract="Microsoft.ServiceModel.Samples.ICalculator" /> </client> <!-- Configures WSHttpBinding for reliable sessions with ordered delivery --> <bindings> <wsHttpBinding> <binding name="Binding1"> <reliableSession enabled="true" ordered="true" /> </binding> </wsHttpBinding> </bindings> </system.serviceModel> </configuration>
Skapa en instans av
ClientCalculator
i ett program och anropa tjänståtgärderna.//Client implementation code. class Client { static void Main() { // Create a client with given client endpoint configuration CalculatorClient client = new CalculatorClient(); // Call the Add service operation. double value1 = 100.00D; double value2 = 15.99D; double result = client.Add(value1, value2); Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); // Call the Subtract service operation. value1 = 145.00D; value2 = 76.54D; result = client.Subtract(value1, value2); Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result); // Call the Multiply service operation. value1 = 9.00D; value2 = 81.25D; result = client.Multiply(value1, value2); Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result); // Call the Divide service operation. value1 = 22.00D; value2 = 7.00D; result = client.Divide(value1, value2); Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result); //Closing the client gracefully closes the connection and cleans up resources client.Close(); Console.WriteLine(); Console.WriteLine("Press <ENTER> to terminate client."); Console.ReadLine(); } }
Kompilera och kör klienten.
Exempel
Flera av bindningarna som tillhandahålls av systemet stöder tillförlitliga sessioner som standard. Dessa kan vara:
Ett exempel på hur du skapar en anpassad bindning som stöder tillförlitliga sessioner finns i Så här skapar du en anpassad tillförlitlig sessionsbindning med HTTPS.