WCF bietet im Wesentlichen einen prozess-, maschinen- und sogar netzwerkübergreifenden Dienstaufruf. In diesem Beispiel werden die meisten Funktionen aus den Beiträgen anderer Personen im Internet implementiert Ich nenne es, auf den Schultern von Riesen zu stehen, O(∩_∩)O haha~, aber um mein Verständnis von wcf zu vertiefen, habe ich beschlossen, selbst eine ähnliche Demo zu schreiben, um die Probleme aufzuzeigen, die beim Schreiben der Demo aufgetreten sind Für diejenigen, die neu im WCF-Programm sind Als Mitarbeiter werden Sie auch auf verschiedene Probleme stoßen. Okay, kommen wir zum Punkt.
WCF ist in vier Teile unterteilt: 1. Vertrag (Schnittstelle) 2. Servicevertrag (Dienst) 3. WCF-Hostprogramm (Konsole oder IIS) 4. Client (Client)
Ich beim Schreiben wcf, ich teile die vier Teile zur Verwaltung gerne in verschiedene Klassenbibliotheken auf.
1. Vertrag
Der Vertrag ist eine für die Außenwelt offene Schnittstelle. Erstellen Sie zunächst eine neue WCF-Dienstbibliothek mit dem Namen „Schnittstelle“. :
Löschen Sie die Standarddateien im Programm (App.config, IService1.cs, Service1.cs) und erstellen Sie einen neuen ICalculator
namespace Interface { [ServiceContract(Name = "CalculatorService", Namespace = "")]public interface ICalculator { [OperationContract]double Add(double x, double y); [OperationContract]double Subtract(double x, double y); [OperationContract]double Multiply(double x, double y); [OperationContract]double Divide(double x, double y); } }
2. Das Erstellen eines neuen Servicevertrags ist eigentlich die Klasse, die den Vertrag implementiert. Fügen Sie „Neues Projekt“->WCF->„WCF-Servicebibliothek“ hinzu (der erste Schritt ist der gleiche wie das Erstellen eines neuer Vertrag). ), fügen Sie einen Verweis auf die Klassenbibliothek „Interface“ hinzu, erstellen Sie einen neuen CalculatorService und implementieren Sie ICalculator
3. Erstellen Sie ein neues WCF-Hostprogramm und einen neuen WCF-Dienstvertrag wurden abgeschlossen, es wird jedoch noch ein Programm benötigt, um diese Schnittstellen für den Aufruf externer Programme zu hosten. Daher wird es als Host-Programm bezeichnet. Das Host-Programm kann auf IIS bereitgestellt oder zum einfachen Debuggen als Konsolenprogramm ausgeführt werden Im Folgenden werde ich die Verwendung des Konsolenprogramms als Hostprogramm vorstellen. Klicken Sie mit der rechten Maustaste auf den Namen der Lösung, fügen Sie „Konsolenprogramm“ mit dem Namen „Hosting“ hinzu und fügen Sie Verweise auf „Schnittstelle“ und „Dienst“ hinzu. Es gibt zwei Möglichkeiten, WCF für die Außenwelt zu öffnen. Eine Möglichkeit ist die Konfiguration Die Datei zum Kombinieren aller WCF-Informationen. Alle werden in die Konfigurationsdatei geschriebennamespace Service { [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]public class CalculatorService : ICalculator {public double Add(double x, double y) {return x + y; }public double Subtract(double x, double y) {return x - y; }public double Multiply(double x, double y) {return x * y; }public double Divide(double x, double y) {return x / y; } }
<?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/> </startup> <system.serviceModel> <services> <service name="Service.CalculatorService" behaviorConfiguration="WCFService.WCFServiceBehavior"> <endpoint address="http://127.0.0.1:8888/CalculatorService" binding="wsHttpBinding" contract="Service.Interface.ICalculator"> </endpoint> <endpoint address="net.tcp://127.0.0.1:9999/CalculatorService" binding="netTcpBinding" contract="Service.Interface.ICalculator"> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="http://127.0.0.1:8888/"/> <add baseAddress="net.tcp://127.0.0.1:9999/"/> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior name="WCFService.WCFServiceBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
public class Program {internal static ServiceHost host = null;static void Main(string[] args) {using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) { host.Opened += delegate{ Console.WriteLine("CalculaorService已经启动,按任意键终止服务!"); }; host.Open(); Console.ReadLine(); } } }
public static class WCFHelper {public static string IP { get; set; }public static int Port { get; set; }static WCFHelper() {try{ IP = System.Environment.MachineName;// ConfigurationManager.AppSettings["ServiceIP"];// Port = int.Parse(ConfigurationManager.AppSettings["ServicePort"]); }catch{ } EndpointAddress.Add(BindingProtocol.Http, "http://{0}:{1}/{2}/{3}"); EndpointAddress.Add(BindingProtocol.NetTcp, "net.tcp://{0}:{1}/{2}/{3}");//EndpointAddress.Add(BindingProtocol.NetMsmq, "net.msmq://{0}:{1}/" + schema + "/{2}");//EndpointAddress.Add(BindingProtocol.NetPipe, "net.pipe://{0}:{1}/" + schema + "/{2}");try{ httpBinding = new BasicHttpBinding(); httpBinding.MaxBufferSize = 200065536; httpBinding.MaxReceivedMessageSize = 200065536; httpBinding.CloseTimeout = new TimeSpan(0, 10, 0); httpBinding.OpenTimeout = new TimeSpan(0, 10, 0); httpBinding.ReceiveTimeout = new TimeSpan(0, 10, 0); httpBinding.SendTimeout = new TimeSpan(0, 1, 0); httpBinding.Security.Mode = BasicHttpSecurityMode.None; httpBinding.ReaderQuotas.MaxDepth = 64; httpBinding.ReaderQuotas.MaxStringContentLength = 2147483647; httpBinding.ReaderQuotas.MaxArrayLength = 16384; httpBinding.ReaderQuotas.MaxBytesPerRead = 4096; httpBinding.ReaderQuotas.MaxNameTableCharCount = 16384; }catch{ httpBinding = new BasicHttpBinding(); }try{ tcpBinding = new NetTcpBinding(); tcpBinding.CloseTimeout = new TimeSpan(0, 1, 0); tcpBinding.OpenTimeout = new TimeSpan(0, 1, 0); tcpBinding.ReceiveTimeout = new TimeSpan(0, 10, 0); tcpBinding.SendTimeout = new TimeSpan(0, 1, 0); tcpBinding.TransactionFlow = false; tcpBinding.TransferMode = TransferMode.Buffered; tcpBinding.TransactionProtocol = TransactionProtocol.OleTransactions; tcpBinding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; tcpBinding.ListenBacklog = 100000; tcpBinding.MaxBufferPoolSize = 524288; tcpBinding.MaxBufferSize = 200065536; tcpBinding.MaxConnections = 2000; tcpBinding.MaxReceivedMessageSize = 200065536; tcpBinding.PortSharingEnabled = true; tcpBinding.Security.Mode = SecurityMode.None; tcpBinding.ReaderQuotas.MaxDepth = 64; tcpBinding.ReaderQuotas.MaxStringContentLength = 2147483647; tcpBinding.ReaderQuotas.MaxArrayLength = 163840000; tcpBinding.ReaderQuotas.MaxBytesPerRead = 4096; tcpBinding.ReaderQuotas.MaxNameTableCharCount = 16384; tcpBinding.ReliableSession.Ordered = true; tcpBinding.ReliableSession.InactivityTimeout = new TimeSpan(0, 10, 0); tcpBinding.ReliableSession.Enabled = false; }catch{ tcpBinding = new NetTcpBinding(); } }private static BasicHttpBinding httpBinding;public static BasicHttpBinding HttpBinding {get{return httpBinding; } }private static NetTcpBinding tcpBinding;public static NetTcpBinding TcpBinding {get{return tcpBinding; } }public static EndpointAddress GetEndpointAddress(string ip, int port, string serviceSchema, string serviceName, BindingProtocol protocol) {string address = EndpointAddress[protocol]; address = string.Format(address, ip, port, serviceSchema, serviceName);return new EndpointAddress(address); }public static EndpointAddress GetEndpointAddress(string serviceSchema, string serviceName, BindingProtocol protocol) {string address = EndpointAddress[protocol]; address = string.Format(address, IP, Port, serviceSchema, serviceName);return new EndpointAddress(address); }public static Uri GetBaseAddress(string ip, int port, string serviceSchema, string serviceName, BindingProtocol protocol) {string address = EndpointAddress[protocol]; address = string.Format(address, ip, port + 1, serviceSchema, serviceName);return new Uri(address); }public static Uri GetBaseAddress(string serviceSchema, string serviceName, BindingProtocol protocol) {string address = EndpointAddress[protocol]; address = string.Format(address, IP, Port + 1, serviceSchema, serviceName);return new Uri(address); }private readonly static Dictionary<BindingProtocol, string> EndpointAddress = new Dictionary<BindingProtocol, string>();public enum BindingProtocol { Http = 1, NetTcp = 2,//NetPipe = 3,//NetMsmq = 4 } }
static void Main(string[] args) { WCFHelper.IP = "127.0.0.10"; WCFHelper.Port = 9999; Uri httpUri = WCFHelper.GetBaseAddress(WCFHelper.IP, WCFHelper.Port, "Calculator", "Inspect", WCFHelper.BindingProtocol.Http);using (ServiceHost host = new ServiceHost(typeof(CalculatorService), httpUri)) { host.AddServiceEndpoint(typeof(ICalculator), WCFHelper.TcpBinding, WCFHelper.GetEndpointAddress(WCFHelper.IP, WCFHelper.Port, "Calculator", "InspectService", WCFHelper.BindingProtocol.NetTcp).Uri.AbsoluteUri); ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();#if DEBUGbehavior.HttpGetEnabled = true;#elsebehavior.HttpGetEnabled = false;#endifhost.Description.Behaviors.Add(behavior); host.Opened += delegate{ Console.WriteLine("CalculaorService已经启动,按任意键终止服务!"); }; host.Open(); Console.ReadLine(); } }
Zweitens fügen Sie das WinForm-Programm im Lösungsnamen hinzu. Klicken Sie mit der rechten Maustaste, um ein neues WinForm-Programm zu erstellen, und fügen Sie „Dienstreferenz“ hinzu.
Dienstreferenz hinzufügen (diese Referenzmethode basiert auf „3. Hostprogramm hinzufügen“ -> „Die zweite WCF-Hilfsklassenmethode“)
Klicken Sie auf „Los“ und das System finden Sie den WCF-Dienst, wie in der folgenden Abbildung gezeigt:
Klicken Sie auf OK und es wird erfolgreich sein. Beginnen wir mit dem Aufruf von WCF Beim Aufrufen der Add-Methode lautet der Code beispielsweise wie folgt:
Denken Sie daran, das Host-Programm auszuführen und Client-Programm gleichzeitig beim Debuggen.
Wenn Sie Probleme haben, unterstützt VS das gleichzeitige Starten mehrerer Projekte. Sie können den Client und den Host gleichzeitig starten
ServiceReference1.CalculatorServiceClient client = new ServiceReference1.CalculatorServiceClient(); textBox3.Text = client.Add(double.Parse(textBox1.Text), double.Parse(textBox2.Text)).ToString();
Das obige ist der detaillierte Inhalt vonVerständnis von wcf – Implementierung der Taschenrechnerfunktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!