94 votes

wcf canal nommé exemple minimal

Je suis à la recherche d'exemple minimal de la WCF canaux Nommés (je m'attends à deux minimale des applications serveur et client peuvent communiquer via le tube Nommé)

Microsoft a ce brillant article http://msdn.microsoft.com/en-us/library/ms734712.aspx qui décrit WCF via HTTP, je suis à la recherche de quelque chose de semblable à propos de la WCF et des canaux nommés.

J'ai trouvé plusieurs posts sur Internet, mais ils sont un peu "avancé". J'ai besoin de quelque chose de minime, seulement les fonctionnalités obligatoire, de sorte que je peux ajouter mon code et des applications de travail.

Comment remplacer que pour utiliser le canal nommé?

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

Comment remplacer que pour utiliser le canal nommé?

// 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();
}

Comment générer du client pour l'utilisation du canal nommé?

82voto

Juan Points 3567

Viens de trouver cet excellent petit tutoriel. J'ai également suivi MME le tutoriel qui est très sympa, mais j'ai seulement besoin de tuyaux.

Comme vous pouvez le voir, vous n'avez pas besoin des fichiers de configuration et tous les résidus encombrants.

Par ailleurs, il utilise les protocoles HTTP et les tuyaux. Tout simplement supprimer toutes les lignes de code relatives à HTTP et vous obtiendrez une pure pipe exemple.

63voto

Anuraj Points 6835

Essayez ceci.

Ici, c'est le service.

[ServiceContract]
public interface IService
{
    [OperationContract]
    void  HelloWorld();
}

public class Service : IService
{
    public void HelloWorld()
    {
        //Hello World
    }
}

Voici les Proxy

public class ServiceProxy : ClientBase<IService>
{
    public ServiceProxy()
        : base(new ServiceEndpoint(ContractDescription.GetContract(typeof(IService)),
            new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/helloservice")))
    {

    }
    public void InvokeHelloWorld()
    {
        Channel.HelloWorld();
    }
}

Et ici, c'est le service d'hébergement de la partie.

var serviceHost = new ServiceHost
        (typeof(Service), new Uri[] { new Uri("net.pipe://localhost/") });
    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);
    }

16voto

Alan S Points 370

Découvrez mon très simplifiée Echo exemple: Il est conçu pour une utilisation de base de la communication HTTP, mais il peut facilement être modifié pour utiliser des canaux nommés par l'édition de l' application.config fichiers pour le client et le serveur. Apportez les modifications suivantes:

Modifier le serveur de l' application.config fichier, en éliminant ou en commentant la http baseAddress entrée et l'ajout d'un nouveau baseAddress entrée pour le tube nommé (appelé net.pipe). Aussi, si vous n'avez pas l'intention d'utiliser HTTP pour un protocole de communication, assurez-vous que le serviceMetadata et serviceDebug est soit en commentaire ou supprimés:

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

Modifier le client de l' application.config fichier de sorte que le basicHttpBinding est soit en commentaire ou supprimés, et un netNamedPipeBinding entrée est ajoutée. Vous aurez aussi besoin de changer le point de terminaison de l'entrée à l'utilisation de 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'exemple ci-dessus ne fonctionnera qu'avec des canaux nommés, mais rien ne vous empêche d'utiliser plusieurs protocoles pour exécuter votre service. Autant que je sache, vous devriez être en mesure d'avoir un serveur à exécuter un service en utilisant les canaux nommés et HTTP (ainsi que d'autres protocoles).

Aussi, la liaison dans le client de l' application.config fichier est très simplifiée. Il ya beaucoup de différents paramètres que vous pouvez régler, en dehors de la spécification de la baseAddress...

-1voto

Marvin Thobejane Points 356

Juste pour ajouter de l'information qui je pense sera utile. Sur de nombreux (si pas tous) des occasions, Microsoft par défaut n'autorise que les adresses commençant par http://localhost:8732/Design_Time_Addresses/. (E. g. http://localhost:8732/Design_Time_Addresses/TestService.)

Si vous rencontrez des problèmes avec les adresses, essayez de changer votre baseAddress ou à toute autre adresse de service à ce format. Puis plus tard, vous pourrez le modifier si vous vous sentez WCF est approprié pour votre projet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X