При попытке создать клиент-серверное приложение WCF в Mono мы столкнулись с некоторыми проблемами.
Сокращая это до простого примера, мы обнаружили, что служба принимает только одного клиента за раз. Если другой клиент пытается подключиться, он зависает, пока не отключится первый.
Простое изменение на BasicHttpBinding исправляет это, но нам необходим NetTcpBinding для дуплексной связи. Также проблема не появляется, если скомпилирована под MS .NET.
РЕДАКТИРОВАТЬ: Я сомневаюсь (и надеюсь, что нет), что Mono не поддерживает то, что я пытаюсь сделать. Насколько я заметил, моно-код обычно генерирует исключения NotImplementedException в таких случаях. Я использую Mono 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.
Я буду обновлять детали по мере необходимости.