Форум программистов, компьютерный форум, киберфорум
C#: Веб-сервисы и WCF
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 319
1

Динамическое обновление клиента и сервера

28.09.2016, 14:53. Просмотров 1561. Ответов 5
Метки нет (Все метки)


Здравствуйте!
У меня возникло несколько вопросов. Допустим, сервис работает мультипоточно в единственном экземпляре и к нему с определенной периодичностью подключаются клиенты.
Если мне понадобится обновить сервер (Например, добавить пару методов в контракт):

1) Могу ли я это сделать динамически без перекомпиляции?
Чутье подсказывает, что нельзя.
2) Тогда можно ли клиенту динамически обновиться?

Мне нужна удобная система для обновлений. Подскажите, как это реализовывается?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2016, 14:53
Ответы с готовыми решениями:

Обновление базы от сервера на локальный компьютер через клиента
во общем такая проблемка настигла. Объясняю: есть сервер на котором находится база данных ...

Динамическое обновление части страницы по решению сервера
Всем здравствуйте! На странице есть информация, которая должна обновляться динамически. Например...

Клиента Сервера
Всем привет. В общем я с другом создаю проект, в котором друг пишет сайт на php, а я создаю клиент...

Обновление игрового клиента
Есть клиент онлайн игры, будь это Minecraft, S4, LoL значения не имеет, Есть лаунчер, который...

5
Модератор
Эксперт .NET
5304 / 4100 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
28.09.2016, 15:05 2
Цитата Сообщение от Kertis138 Посмотреть сообщение
1) Могу ли я это сделать динамически без перекомпиляции?
Можете, если служба конфигурируется в файле конфигурации, а не в коде. Именно для того он и создан.
Цитата Сообщение от Kertis138 Посмотреть сообщение
2) Тогда можно ли клиенту динамически обновиться?
В теории можно (запросив через MEX все контракты и все поддерживаемые в них операции), но думаю, потом их вызов будет затруднен. Если только через рефлексию пробовать.
Я так не делал, больше ничего не подскажу.
1
6 / 6 / 1
Регистрация: 25.02.2016
Сообщений: 319
28.09.2016, 15:08  [ТС] 3
insite2012, Насчет файла конфигурации: я настраиваю все через него, но я же там пишу только конечные точки, элементы поведения.
Достаточно этот файл пересоздать или как?
0
Модератор
Эксперт .NET
5304 / 4100 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
28.09.2016, 15:17 4
Лучший ответ Сообщение было отмечено Kertis138 как решение

Решение

Цитата Сообщение от Kertis138 Посмотреть сообщение
я же там пишу только конечные точки, элементы поведения.
А больше ничего и не надо. Хост независим от самой службы. Вы можете, изменив конфиг, полностью изменить службу, и перезапустив хост все будет другое.
0
.NET senior
437 / 355 / 137
Регистрация: 23.09.2016
Сообщений: 980
30.09.2016, 08:01 5
Лучший ответ Сообщение было отмечено Kertis138 как решение

Решение

Kertis138, насколько я помню, при реализации взаимодействия клиент-сервер на платформе WCF клиент обязательно должен поддерживать все методы контракта сервиса, в противном случае при попытке вызова будет сгенерировано исключение типа "несовпадение контрактов между клиентом и сервисом".
Так что клиентов также придётся перевести на изменённый контракт и перекомпилировать.
1
Модератор
Эксперт .NET
5304 / 4100 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
30.09.2016, 23:51 6
Лучший ответ Сообщение было отмечено Kertis138 как решение

Решение

Цитата Сообщение от bax_tang Посмотреть сообщение
клиент обязательно должен поддерживать все методы контракта сервиса, в противном случае при попытке вызова будет сгенерировано исключение типа "несовпадение контрактов между клиентом и сервисом".
Совершенно необязательно. Тестовый код ниже. В контракте сервиса два метода, а в контракте клиента один. И тем не менее код работает.
Цитата Сообщение от bax_tang Посмотреть сообщение
клиентов также придётся перевести на изменённый контракт и перекомпилировать.
Только в том случае, если используется svcutil.exe
Если же все пишется ручками, этого не потребуется.
Исходя из задумки ТС, как я ее понял, это делается так. Пишется набор контрактов, и служба предоставляет какой-то один. Клиент не знает, какой именно, запрашивает метаданные конечной точки, и ищет в своем наборе контрактов подходящие. Если нашел - динамически создает прокси и использует его.
PROFIT!
Тестовая служба:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
 
namespace DynamicContractService {
    class Program {
        static void Main(string[] args) {
            using (ServiceHost host = new ServiceHost(typeof(Service), new Uri("http://localhost:8090/Service"))) {
                host.AddServiceEndpoint(typeof(IContract), new BasicHttpBinding(), "");
                ServiceMetadataBehavior mexBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
                if (mexBehavior == null) {
                    mexBehavior = new ServiceMetadataBehavior { HttpGetEnabled = true };
                    host.Description.Behaviors.Add(mexBehavior);
                }
                host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
                host.Opening += new EventHandler(host_Opening);
                host.Opened += new EventHandler(host_Opened);
                host.Open();
                Console.ReadLine();
            }
        }
 
        static void host_Opened(object sender, EventArgs e) {
            Console.WriteLine("Service is ready...");
        }
 
        static void host_Opening(object sender, EventArgs e) {
            Console.WriteLine("Opening service...");
        }
    }
    [ServiceContract]
    public interface IContract {
        [OperationContract]
        void Method1();
        [OperationContract]
        void Method2();
    }
    public class Service : IContract {
        public void Method1() {
            Console.WriteLine("Calling Method1()!");
        }
 
        public void Method2() {
            Console.WriteLine("Calling Method2()!");
        }
    }
}
Тестовый клиент:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
 
namespace DynamicClient {
    class Program {
        static void Main(string[] args) {
            IContract proxy = ChannelFactory<IContract>.CreateChannel(new BasicHttpBinding(), new EndpointAddress("http://localhost:8090/Service"));
            proxy.Method1();
            Console.ReadLine();
        }
    }
    [ServiceContract]
    public interface IContract {
        [OperationContract]
        void Method1();
    }
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2016, 23:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Обновление игрового клиента
Есть игровой клиент, я для него пишу лаунчер. Подкиньте идею как правильно обновлять игровой...

С сервера вызвать клиента
очень очень нужно вызвать из процедуры в модуле объекта открыть форму нужно, т.е. совершить...

Синхронизация клиента и сервера
1. Сервер генерирует число double. Например 3.25. 2. Сервер посылает клиенту сообщение о старте....

Настройка клиента - сервера
Приветствую форумчане,помогите,пожалуйста,решить проблемку.. Имеется сервер: import...

Связь сервера и клиента
Всем привет. Вопрос не из жизни, а из обучения. У меня есть прилага - несколько jar файлов(8). В...

Соединение клиента и сервера
Пожалуйста, помогите! Не знаю, что уж и делать... Сделал клиент-серверный шаблон по примеру из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.