Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym przykładzie aplikacja konsolowa klienta jest tworzona w celu korzystania z usługi kalkulatora, a powiązanie dla tego klienta jest określane deklaratywnie w konfiguracji. Klient uzyskuje dostęp do CalculatorService obiektu, który implementuje interfejs ICalculator, a zarówno klient, jak i usługa używają klasy BasicHttpBinding.
W opisanej procedurze przyjęto założenie, że usługa kalkulatora jest uruchomiona. Aby uzyskać informacje o sposobie kompilowania usługi, zobacz How to: Specify a Service Binding in Configuration (Instrukcje: określanie powiązania usługi w konfiguracji). Używa również narzędzia ServiceModel Metadata Tool (Svcutil.exe), które program Windows Communication Foundation (WCF) udostępnia w celu automatycznego generowania składników klienta. Narzędzie generuje kod klienta i konfigurację na potrzeby uzyskiwania dostępu do usługi.
Klient składa się z dwóch części. Svcutil.exe generuje ClientCalculator element implementujący ICalculator interfejs. Ta aplikacja kliencka jest następnie tworzona przez utworzenie wystąpienia klasy ClientCalculator.
Zazwyczaj najlepszym rozwiązaniem jest określenie powiązania i adresu informacji deklaratywnie w konfiguracji, a nie imperatywnie w kodzie. Definiowanie punktów końcowych w kodzie zwykle nie jest praktyczne, ponieważ powiązania i adresy wdrożonej usługi zwykle różnią się od tych używanych podczas opracowywania usługi. Ogólnie rzecz biorąc, utrzymywanie powiązania i adresowania informacji poza kodem umożliwia ich zmianę bez konieczności ponownego kompilowania lub ponownego wdrażania aplikacji.
Wszystkie poniższe kroki konfiguracji można wykonać przy użyciu narzędzia edytora konfiguracji (SvcConfigEditor.exe).
Aby uzyskać kopię źródłową tego przykładu, zobacz przykład BasicBinding .
Określanie powiązania klienta w konfiguracji
Użyj Svcutil.exe z wiersza polecenia, aby wygenerować kod na podstawie metadanych usługi.
Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>Wygenerowany klient zawiera interfejs
ICalculator, który definiuje kontrakt usługi, jaki musi spełniać implementacja klienta.[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [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); }[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); }Wygenerowany klient zawiera również implementację
ClientCalculator.[System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] 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); } }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; } }Svcutil.exe również generuje konfigurację klienta korzystającego z BasicHttpBinding klasy . W przypadku korzystania z programu Visual Studio nadaj temu plikowi nazwę App.config. Należy pamiętać, że informacje o adresie i powiązaniu nie są określone w żadnym miejscu wewnątrz implementacji usługi. Ponadto kod nie musi być zapisywany w celu pobrania tych informacji z pliku konfiguracji.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <client> <endpoint name="" address="http://localhost/servicemodelsamples/service.svc" binding="basicHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator" /> </client> <bindings> <basicHttpBinding/> </bindings> </system.serviceModel> </configuration>Utwórz wystąpienie
ClientCalculatorw aplikacji, a następnie wywołaj operacje usługi.using System; using System.ServiceModel; namespace Microsoft.ServiceModel.Samples { //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({value1},{value2}) = {result}"); // Call the Subtract service operation. value1 = 145.00D; value2 = 76.54D; result = client.Subtract(value1, value2); Console.WriteLine($"Subtract({value1},{value2}) = {result}"); // Call the Multiply service operation. value1 = 9.00D; value2 = 81.25D; result = client.Multiply(value1, value2); Console.WriteLine($"Multiply({value1},{value2}) = {result}"); // Call the Divide service operation. value1 = 22.00D; value2 = 7.00D; result = client.Divide(value1, value2); Console.WriteLine($"Divide({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(); } } }Skompiluj i uruchom klienta.