Wcf Duplex Contract

234
09 мая 2017, 02:41
Краткое описание того, что необходимо сделать
  1. Клиент входит к сервису(LogIn)
  2. В ответ получает свой уникальный id
  3. Далее идет использование DuplexContract
    • Клиент подписывается на рассылку прогноза погоды указывая свой уникальный id, город и страну.
    • Основная цель - это чтобы клиент подписался, запустилась обработка прогноза в новом потоке для этого клиента и в случае его изменения отослать callback клиенту с прогнозом.
    • Но нет смысла делать новый поток для каждого клиента, лучше делать поток для каждого города + страны и отсылать изменения всем клиентам с таким городом и страной
Как это реализовать?

Моя попытка:
Service Contract и имплементация сервиса

[ServiceContract(CallbackContract = typeof(IWeatherCallback))]
public interface IWeather
{
    [OperationContract]
    string LogInToService(string login, string password);
    [OperationContract(IsOneWay = true)]
    void RegisterForUpdates(string userId, string city, string country);
}
public interface IWeatherCallback
{
    [OperationContract(IsOneWay = true)]
    void WeatherUpdate(OpenWeather weather);
}
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single,
    InstanceContextMode = InstanceContextMode.PerCall)]
public class WeatherService : IWeather
{
    public class CallbacksRequest
    {
        public List<string> Clients;
        public string city;
        public string country;
        public IWeatherCallback callbackProcess;
        public CallbacksRequest()
        {
            Clients = new List<string>();
        }
    }
    public static List<CallbacksRequest> requests = new List<CallbacksRequest>();
    public string LogInToService(string login, string password)
    {
        if (login == "admin" && password == "admin")
            return "2kj2348wfhn34,ms";
        else
            return null;
    }
    public void RegisterForUpdates(string userId, string city, string country)
    {
        var suchRequest = requests.Where(x => x.city == city && x.country == country)
            .Select((x,index) => new { Request = x, Index = index }).FirstOrDefault();
        if(suchRequest == null)
        {
            CallbacksRequest newRequest = new CallbacksRequest() { city = city, country = country };
            newRequest.Clients.Add(userId);
            newRequest.callbackProcess = OperationContext.Current.GetCallbackChannel<IWeatherCallback>();
            requests.Add(newRequest);

            //Thread t = new Thread(new ThreadStart(SendUpdateToClient(newRequest)));
            //t.IsBackground = true;
            //t.Start();
        }
        else
        {
            if (!suchRequest.Request.Clients.Contains(userId))
                requests[suchRequest.Index].Clients.Add(userId);
        }
    }
    private void SendUpdateToClient(CallbacksRequest req)
    {
    }
}
READ ALSO
Загрузка изображений из интернета в PictureBox

Загрузка изображений из интернета в PictureBox

Пользователь выбирает объект в ListBox и нажимает ButtonПрограмма должна по названию выбранного объекта найти в Google Картинках изображение и загрузить...

230
Как скопировать файлы в одном цикле?

Как скопировать файлы в одном цикле?

Как сделать копирование файлов в 1 часть папки, а 2 часть во внутреннею папку с использование Linq ?

222
Правильно ли организован код?

Правильно ли организован код?

Очень смущает "зависимость" методов:

249