При попытке создать клиент-серверное WCF-приложение в Mono мы столкнулись с некоторыми проблемами. Сократив это до простого примера, мы обнаружили, что служба принимает только одного клиента за раз. Если другой клиент пытается подключиться, он зависает, пока первый не отключится.
Простой переход на BasicHttpBinding исправляет это, но нам нужен NetTcpBinding для дуплексной связи. Также проблема не появляется, если скомпилирован под MS .NET.
EDIT: я сомневаюсь (и надеюсь, что нет), что Mono не поддерживает то, что я пытаюсь сделать. Насколько я заметил, монокод обычно выдает NotImplementedExceptions в таких случаях. Я использую Моно v2.6.4
Вот как сервис открывается в нашем базовом сценарии:
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 ();
}
Клиентский канал получается так:
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 ();
Насколько я знаю, это симплексное соединение, не так ли?
Контракт прост:
[ServiceContract]
public interface IHello
{
[OperationContract]
string Greet (string name);
}
Реализация службы не имеет тегов или атрибутов ServiceModel.
Я обновлю детали по мере необходимости.