У меня есть пример службы для тестирования связи WCF net.tcp. Это очень простая служба, и все, что она делает, — это подписывает клиента на службу, а затем вызывает канал обратного вызова, чтобы уведомить всех подключенных клиентов о широковещательном сообщении. Служба размещена внутри IIS 7.5.
Вот сервисный код и тестовый клиент для его проверки.
[ServiceContract(CallbackContract = typeof(ISampleServiceCallBack), SessionMode = SessionMode.Required)]
public interface ISampleCuratioService
{
[OperationContract(IsOneWay = true)]
void SubcribeToService(string sub);
[OperationContract]
string GetData(int value);
[OperationContract(IsOneWay = true)]
void Broadcast(string message);
}
public interface ISampleServiceCallBack
{
[OperationContract(IsOneWay = true)]
void NotifyClient(string message);
}
Вот реализация сервиса:
[ServiceBehavior(Name = "CuratioCSMService", InstanceContextMode = InstanceContextMode.PerSession)]
public class Service1 : ISampleCuratioService
{
private static List<ISampleServiceCallBack> JoinedClien = new List<ISampleServiceCallBack>();
public void SubcribeToService(string sub)
{
var subscriber = OperationContext.Current.GetCallbackChannel<ISampleServiceCallBack>();
if (!JoinedClien.Contains(subscriber))
{
JoinedClien.Add(subscriber);
}
}
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public void Broadcast(string message)
{
JoinedClien.ForEach(c => c.NotifyClient("message was received " + message));
}
}
Я не могу понять поведение, которое я получаю при запуске. После запуска первого клиента все работает нормально, но когда я закрываю и открываю тестовое клиентское приложение, оно выдает исключение, уведомляющее о том, что канал не может использоваться для связи, поскольку он находится в состоянии сбоя.
Это пример тестового клиента:
static void Main(string[] args)
{
var callneckclient = new ServiceClientProxy();
var client = new SampleCuratioServiceClient(new InstanceContext(callneckclient));
client.SubcribeToService("me");
Console.ReadLine();
for (int i = 0; i < 15; i++)
{
Console.WriteLine(client.GetData(5));
client.Broadcast("this is from client me");
}
client.Close();
Console.Read();
}
public class ServiceClientProxy : ISampleCuratioServiceCallback, IDisposable
{
public void NotifyClient(string message)
{
Console.WriteLine(message);
}
public void Dispose()
{
GC.SuppressFinalize(this);
}
}
Ситуация становится еще хуже, когда я запускаю 5 клиентов. Ни один из них не отправляет и не получает сообщения.