Verständnis von wcf – Implementierung der Taschenrechnerfunktion

零下一度
Freigeben: 2017-06-24 09:36:32
Original
1835 Leute haben es durchsucht

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);

    }
}
Nach dem Login kopieren

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 geschrieben
namespace 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;
        }
    }
Nach dem Login kopieren
Der erste Typ: WCF-bezogene Informationen werden in die Konfigurationsdatei (App.config) geschrieben

<?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>
Nach dem Login kopieren
Der Hauptcode der Main-Methode lautet wie folgt:

Führen Sie das Konsolenprogramm aus, wie in gezeigt Die Abbildung unten:

    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();
            }
        }
    }
Nach dem Login kopieren
Zweiter Typ: Schreiben Sie eine WCFHelper-Klasse. Achten Sie beim Hinzufügen der Hilfsklasse darauf, auf System.Runtime.Serialization zu verweisen und die WCF-Konfiguration in App zu löschen. config. Andernfalls wird der Fehlercode wie folgt gemeldet:

Ändern Sie die Hauptmethode im Host-Programm wie folgt:

 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        }
    }
Nach dem Login kopieren

    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();
            }
}
Nach dem Login kopieren
4. Host Das Programm ist erstellt und alle WCF-Protokolle sind für die Außenwelt zugänglich. Jetzt müssen Sie einen Client erstellen, um das WCF-Programm aufzurufen 🎜>
Kompilieren Sie zunächst das Host-Programm Host, suchen Sie bin/debug/Host.exe und klicken Sie mit der rechten Maustaste auf den Administrator. Öffnen Sie, wenn das folgende Bild beweist, dass der Dienst in Ning installiert wurde

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();
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage