it-swarm.it

Esempio minimo di pipe denominato WCF

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

Microsoft ha l'articolo brillante Tutorial introduttivo 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 pipe con nome?

<endpoint address="http://localhost:8000/ServiceModelSamples/Service/CalculatorService"
    binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator"
    contract="ICalculator" name="WSHttpBinding_ICalculator">
    <identity>
        <userPrincipalName value="OlegPc\Oleg" />
    </identity>
</endpoint>

Come posso sostituirlo per usare una pipe con nome?

// 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 <ENTER> 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?

89
javapowered

Ho appena trovato questo eccellente piccolo tutorial .  link non funzionante ( Versione cache )

Ho anche seguito il tutorial di Microsoft che è bello, ma avevo anche bisogno solo di pipe.

Come puoi vedere, non hai bisogno di file di configurazione e tutta quella roba disordinata.

A proposito, usa sia HTTP che pipe. Rimuovi tutte le righe di codice relative a HTTP e otterrai un esempio di pipe pura.

80
Juan

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<IService>
{
    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);
    }
58
Anuraj

Dai un'occhiata al mio esempio Echo altamente semplificato : è progettato per utilizzare la comunicazione HTTP di base, ma può essere facilmente modificato per utilizzare le named pipe modificando il app.config file per client e server. Apporta le seguenti modifiche:

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

<configuration>
    <system.serviceModel>
        <services>
            <service name="com.aschneider.examples.wcf.services.EchoService">
                <Host>
                    <baseAddresses>
                        <add baseAddress="net.pipe://localhost/EchoService"/>
                    </baseAddresses>
                </Host>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors></serviceBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

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

<configuration>
    <system.serviceModel>
        <bindings>
            <netNamedPipeBinding>
                <binding name="NetNamedPipeBinding_IEchoService"/>
            </netNamedPipeBinding>
        </bindings>
        <client>
            <endpoint address              = "net.pipe://localhost/EchoService"
                      binding              = "netNamedPipeBinding"
                      bindingConfiguration = "NetNamedPipeBinding_IEchoService"
                      contract             = "EchoServiceReference.IEchoService"
                      name                 = "NetNamedPipeBinding_IEchoService"/>
        </client>
    </system.serviceModel>
</configuration>

L'esempio sopra verrà eseguito solo con named pipe, ma nulla ti impedisce 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 pipe che HTTP (così come altri protocolli).

Inoltre, l'associazione nel file app.config del client è altamente semplificata. Ci sono molti parametri diversi che puoi regolare, oltre a specificare solo il baseAddress ...

14
Alan S

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

Utilizzando l'URI di cui sopra posso aggiungere un riferimento nel mio client al servizio web.

1
Rahbek