2010-05-31 3 views
6

En essayant de créer une application WCF client-serveur dans Mono, nous avons rencontré quelques problèmes. Réduire à un simple exemple, nous avons constaté que le service n'accepte qu'un seul client à la fois. Si un autre client tente de se connecter, il se bloque jusqu'à ce que le premier se déconnecte.Le service Mono WCF NetTcp ne prend qu'un seul client à la fois

La simple modification de BasicHttpBinding le corrige, mais nous avons besoin de NetTcpBinding pour la communication duplex. Le problème n'apparaît pas non plus s'il est compilé sous MS .NET.

EDIT: Je doute (et j'espère ne pas) que Mono ne supporte pas ce que j'essaie de faire. Le code mono renvoie généralement NotImplementedExceptions dans de tels cas pour autant que j'ai remarqué. J'utilise Mono v2.6.4

Voici comment le service est ouvert dans notre scénario de base:

public static void Main (string[] args) 
{ 
    var binding = new NetTcpBinding(); 
    binding.Security.Mode = SecurityMode.None; 
    var address = new Uri ("net.tcp://localhost:8080"); 
    var host = new ServiceHost (typeof(Hello)); 
    host.AddServiceEndpoint (typeof(IHello), binding, address); 

    ServiceThrottlingBehavior behavior = new ServiceThrottlingBehavior() 
    { 
     MaxConcurrentCalls = 100, 
     MaxConcurrentSessions = 100, 
     MaxConcurrentInstances = 100    
    }; 
    host.Description.Behaviors.Add (behavior); 

    host.Open(); 
    Console.ReadLine(); 
    host.Close(); 

} 

On obtient le canal client comme ceci:

var binding = new NetTcpBinding(); 
binding.Security.Mode = SecurityMode.None; 
var address = new EndpointAddress ("net.tcp://localhost:8080/"); 
var client = new ChannelFactory<IHello> (binding, address).CreateChannel(); 

Pour autant que je sais C'est une connexion Simplex, n'est-ce pas?

Le contrat est tout simplement:

[ServiceContract] 
public interface IHello 
{ 

    [OperationContract] 
    string Greet (string name); 
} 

mise en œuvre du service n'a pas de balises ServiceModel ou attributs.

Je mettrai à jour avec les détails si nécessaire.

+0

À quoi ressemble le service? Comment vous connectez-vous? Ce que je veux dire, c'est l'aspect duplex ... Je ne sais pas si le duplex fonctionne bien (s'il y en a un) en mono. Avez-vous essayé d'exécuter le point de terminaison comme ceci et simplement en utilisant un simple service simplex? – TheNextman

+0

J'ai finalement besoin d'utiliser Duplex, mais cet exemple de base auquel nous sommes revenus est un simple service simplex. Autant que je sache, cela devrait fonctionner correctement, et cela fonctionne avec BasicHttp. Je vais mettre à jour la question avec le reste. – vene

+0

Dans le cas où vous l'avez manqué, il semble que cela pourrait être résolu maintenant. Voir le rapport de bug alexcepois: https://bugzilla.novell.com/show_bug.cgi?id=610659 – TheNextman

Répondre

3

J'ai joué avec ça un peu, et ça ressemble vraiment à un bug Mono.

Je suis en train de porter une application WCF pour fonctionner en Mono pour le moment. J'avais joué avec des trucs de NetTcpBinding, mais je n'avais pas essayé ce scénario (plusieurs connexions à un hôte de service hébergé par Mono). Cependant maintenant je l'essaie, je suis capable de reproduire - à la fois dans 2.6 et le dernier paquet quotidien.

Cela fonctionne cependant dans .NET. Toute différence de comportement entre Mono et .NET est classée comme un bug. Vous devriez l'enregistrer sur Bugzilla avec un cas de test, je posterais aussi dans la newslist de Mono.

Bonne chance.

+0

Peut-être que dans une ancienne version de Mono cela fonctionne, est-ce que quelqu'un a eu de bonnes expériences avec un tel scénario? – vene

+0

WCF ne valait vraiment pas la peine d'être ennuyé en 2.4, c'était plus un aperçu qu'autre chose. Beaucoup de scénarios fonctionnent en 2.6, mais beaucoup ne sont pas implémentés et beaucoup sont cassés. Ils ont réparé beaucoup de choses cassées en 2.8, ce qui était la raison pour laquelle j'étais plutôt optimiste quand j'ai testé le dernier quotidien; mais pas de dés.Je suis intéressé à suivre toute progression que vous faites avec ce que je voudrais utiliser NetTcpBinding (sans duplex, cependant) dans un projet sur lequel je travaille. – TheNextman

+0

En effet, il semble que le NetTcpBinding Mono est cassé pour le moment. J'ai même essayé d'écrire un serveur headless fonctionnant sous Windows avec .NET, afin de n'utiliser que le côté client de la liaison duplex sous Mono. Cela n'a pas fonctionné non plus. – vene

1

Vraiment un bug. Je me demandais s'il y avait une version qui fonctionnait correctement ...

Je l'ai posté à Novell Bugzilla, si vous êtes intéressé par sa progression.

Questions connexes