Esempio minimo di pipe denominato WCF

Sto cercando un esempio minimo di WCF Named Pipes (mi aspetto due applicazioni minime, server e client, che possono comunicare tramite una named pipe).

Microsoft ha l’articolo tutorial Getting Started brillante che descrive WCF via HTTP, e sto cercando qualcosa di simile su WCF e named pipe.

Ho trovato diversi post su Internet, ma sono un po ‘”avanzati”. Ho bisogno di qualcosa di minimo, solo funzionalità obbligatoria, quindi posso aggiungere il mio codice e far funzionare l’applicazione.

Come posso sostituirlo per usare una named pipe?

     

Come posso sostituirlo per usare una named pipe?

 // Step 1 of the address configuration procedure: Create a URI to serve as the base address. Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/Service"); // Step 2 of the hosting procedure: Create ServiceHost ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress); try { // Step 3 of the hosting procedure: Add a service endpoint. selfHost.AddServiceEndpoint( typeof(ICalculator), new WSHttpBinding(), "CalculatorService"); // Step 4 of the hosting procedure: Enable metadata exchange. ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; selfHost.Description.Behaviors.Add(smb); // Step 5 of the hosting procedure: Start (and then stop) the service. selfHost.Open(); Console.WriteLine("The service is ready."); Console.WriteLine("Press  to terminate service."); Console.WriteLine(); Console.ReadLine(); // Close the ServiceHostBase to shutdown the service. selfHost.Close(); } catch (CommunicationException ce) { Console.WriteLine("An exception occurred: {0}", ce.Message); selfHost.Abort(); } 

Come faccio a generare un client per utilizzare una pipe denominata?

Ho appena trovato questo piccolo tutorial eccellente . collegamento interrotto ( versione cache )

Ho seguito anche il tutorial di Microsoft, che è bello, ma ho solo bisogno di tubi.

Come puoi vedere, non hai bisogno di file di configurazione e di tutte quelle cose confuse.

A proposito, usa sia HTTP che pipe. Basta rimuovere tutte le code line relative a HTTP e otterrai un esempio di pipe puro.

Prova questo.

Ecco la parte di servizio.

 [ServiceContract] public interface IService { [OperationContract] void HelloWorld(); } public class Service : IService { public void HelloWorld() { //Hello World } } 

Ecco il proxy

 public class ServiceProxy : ClientBase { public ServiceProxy() : base(new ServiceEndpoint(ContractDescription.GetContract(typeof(IService)), new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/MyAppNameThatNobodyElseWillUse/helloservice"))) { } public void InvokeHelloWorld() { Channel.HelloWorld(); } } 

Ed ecco la parte di hosting del servizio.

 var serviceHost = new ServiceHost (typeof(Service), new Uri[] { new Uri("net.pipe://localhost/MyAppNameThatNobodyElseWillUse") }); serviceHost.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "helloservice"); serviceHost.Open(); Console.WriteLine("Service started. Available in following endpoints"); foreach (var serviceEndpoint in serviceHost.Description.Endpoints) { Console.WriteLine(serviceEndpoint.ListenUri.AbsoluteUri); } 

Guarda il mio esempio di Echo ad alta semplificazione : è progettato per utilizzare la comunicazione HTTP di base, ma può essere facilmente modificato per utilizzare named pipe modificando i file app.config per client e server. Apporta le seguenti modifiche:

Modifica il file app.config del server, rimuovendo o commentando la voce http baseAddress e aggiungendo una nuova voce baseAddress per la named pipe (chiamata net.pipe ). Inoltre, se non si intende utilizzare HTTP per un protocollo di comunicazione, assicurarsi che serviceMetadata e serviceDebug siano commentati o eliminati:

                 

Modifica il file app.config del client in modo che BasicHttpBinding sia commentato o eliminato e venga aggiunta una voce netNamedPipeBinding . Sarà inoltre necessario modificare la voce dell’endpoint per utilizzare la pipe:

             

L’esempio sopra verrà eseguito solo con named pipe, ma nulla ti impedirà di utilizzare più protocolli per eseguire il tuo servizio. AFAIK, dovresti essere in grado di avere un server che esegue un servizio usando sia named pipes che HTTP (così come altri protocolli).

Inoltre, l’associazione nel file app.config del client è molto semplificata. Ci sono molti parametri diversi che puoi regolare, oltre a specificare la baseAddress

Ho creato questo semplice esempio da diversi risultati di ricerca su Internet.

 public static ServiceHost CreateServiceHost(Type serviceInterface, Type implementation) { //Create base address string baseAddress = "net.pipe://localhost/MyService"; ServiceHost serviceHost = new ServiceHost(implementation, new Uri(baseAddress)); //Net named pipe NetNamedPipeBinding binding = new NetNamedPipeBinding { MaxReceivedMessageSize = 2147483647 }; serviceHost.AddServiceEndpoint(serviceInterface, binding, baseAddress); //MEX - Meta data exchange ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); serviceHost.Description.Behaviors.Add(behavior); serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexNamedPipeBinding(), baseAddress + "/mex/"); return serviceHost; } 

Usando l’URI sopra posso aggiungere un riferimento nel mio client al servizio web.