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