tag:blogger.com,1999:blog-6254452432891143412.post3965325023199741755..comments2023-02-11T10:58:21.225+03:00Comments on C# Разработка: WCF service. С чего начать. Основные моменты создание службы.Sergey Vaulinhttp://www.blogger.com/profile/16311012065881214384noreply@blogger.comBlogger11125tag:blogger.com,1999:blog-6254452432891143412.post-33594828274840143692019-04-19T09:57:48.217+03:002019-04-19T09:57:48.217+03:00Либо вести учет всех отправленных методов и на кли...Либо вести учет всех отправленных методов и на клиенте и на сервере после сервер отправляет какие получил чтобы клиент не посылал повторно. Но это вообще из разряда бред.<br /><br />Как и 3 вариант сделать метод который сразу возвращает true<br />после на клиенте перед основным запросом спрашиваю этот метод получаю true отправляю основной метод потом опять отправляю метод. Но опять же если разрыв произошел после отправки основного метода то клиент посчитает что основной метод не дошел<br /><br />Че же эти мелкомягкие не додумались сделать по мимо сертификата и виндовс аутерификации на SecurityMode.Transport еще какой нить свой методКВА696https://www.blogger.com/profile/17953548135012988957noreply@blogger.comtag:blogger.com,1999:blog-6254452432891143412.post-76688057086190483542019-04-19T09:42:46.259+03:002019-04-19T09:42:46.259+03:00Да подключение постоянное ReceiveTimeout = new Tim... Да подключение постоянное ReceiveTimeout = new TimeSpan(24, 0, 0)<br />Но пока как что на сервере отвалившиеся клиенты это не головная боль.<br />var tr = (IClientChannel)CurrentCallback;<br />tr.Closed += ClientDisconnected;<br />tr.Faulted += ClientDisconnected;<br />void ClientDisconnected(object sender, EventArgs e)<br />{<br /> try<br /> {<br /> var tr = clients.Where(x => x.ОбратнаяСвязь == sender).ToList();<br /> clients.Remove(clients.FirstOrDefault(x => x.ОбратнаяСвязь == sender));<br /> }<br /> catch (Exception) { }<br />}<br /><br />И при рассылке в новых потоках проблемный клиент через 5 минут выкидывает исключение и удаляется конечно за 5 минут на этот порванный канал можно отправить кучу всего но при маленькой нагрузке мне не критично, а вот с клиентом к примеру отправляя к примеру заявку безответную IsOneWay = true только после отправки 2 заявки через минуту я получаю ответ что канал разорван и в итоге теряю 2 заявки и сново их набирать.<br /><br />Менять IsOneWay на false и на все вопросы возвращать просто true это значит менять всю логику и переходить на многапоточность чего бы на сегодняшний день не хотелось делать<br />bool Метод(){<br /><br />ThreadPool.QueueUserWorkItem(ДругойМетод);<br /><br />return true;<br />}<br />КВА696https://www.blogger.com/profile/17953548135012988957noreply@blogger.comtag:blogger.com,1999:blog-6254452432891143412.post-23337703839738139022019-04-18T22:31:01.824+03:002019-04-18T22:31:01.824+03:00SecurityMode.Transport не использовал, для коррект...SecurityMode.Transport не использовал, для корректного разрыва требуется клиент закрывать service.Close(), если на канальном уровне произойдёт отключение, тогда сервер узнает об отключении когда произойдёт таймаут привязки. Соответвенно если выставить огромное время то и ожидать будете соотвевенно. <br /><br />Если ваш контракт с сессией (постоянным соединением), тогда можно использовать пример выше <br /><br />public class MyService : IMyService, IDisposable<br /><br />Где в Dispose() при разрыве я получал уведомление о разрыве соединенияSergey Vaulinhttps://www.blogger.com/profile/16311012065881214384noreply@blogger.comtag:blogger.com,1999:blog-6254452432891143412.post-45175123678088938932019-04-18T20:25:54.697+03:002019-04-18T20:25:54.697+03:00А вы случайно не работали с SecurityMode.Transport...А вы случайно не работали с SecurityMode.Transport?<br /><br />serviceHost.AddServiceEndpoint(typeof(IServices), new NetTcpBinding(SecurityMode.Transport), "");<br /><br />Мне понравилось когда работая на одном компе клиент и служба с настройками по умолчанию при разрыве соединения клиент сразу же узнает о разрыве соединения<br />Но вот беда запустил с разных компов и полезли ошибки что то типо SSL.<br />Возможно ли на SecurityMode.Transport использовать какую нить свою проверку или по отключать (просто при TcpClientCredentialType.None или SslProtocols.None - перестает работать все)<br /><br />Или может есть какой то другой вариант при отправки void на Duplex первое сообщение при разорванном канале пропадает бесследно ошибка вылазиет только после 2 отправки любова метода. (вот пример если я не понятно не по русски вывозился http://www.cyberforum.ru/web-services-wcf/thread2432075.html#post13474296 я думал там что проблему решил выставив на SecurityMode.Transport но не тут то было теперь для релиза нужен сертификат который приобрести нету возможности)КВА696https://www.blogger.com/profile/17953548135012988957noreply@blogger.comtag:blogger.com,1999:blog-6254452432891143412.post-26693349455785138962019-04-17T21:49:23.226+03:002019-04-17T21:49:23.226+03:00Про какие то ограничения на кол-во методов я не зн...Про какие то ограничения на кол-во методов я не знаю. С авторизацией лучший способ (он же в книге описан) выдавать какойто GUID после авторизации пользователя, запоминать его на сервере и при обращении к методу контракта передавать этот GUID что бы сервер понимал кто перед ним.<br /><br />Пример можете поглядеть у меня в игре "Шахматы" https://www.devowl.net/2018/09/network-chess-game-csharp-source-code.html <br /><br />Так же, что бы в 40 методах не добавлять параметр достаточно добавить 1 метод в контракте Authorizate(GUID userId) c пометкой<br /><br />[OperationContract(IsInitiating = true)]<br /><br />Который проверит userId и в случае наличия этого пользователя даст работать дальше со службой (опять же в шахматах есть этот пример).<br /><br />Еще один минус, если у вас 1 контракт то вы не сможете точечно настроить какую то группу контрактов, вам придётся писать Binding для всех 40 методов одного вида.<br /><br />Тот же Duplex стоит вынести в отдельный контракт точно.<br /><br />Готов поспорить что 40 методов можно как то логически разделить если подумать часик :)Sergey Vaulinhttps://www.blogger.com/profile/16311012065881214384noreply@blogger.comtag:blogger.com,1999:blog-6254452432891143412.post-87762514258267266562019-04-17T18:00:47.733+03:002019-04-17T18:00:47.733+03:00А не подскажите почему на WCF не желательно чтобы ...А не подскажите почему на WCF не желательно чтобы было много методов больше 20<br />Джувел Лёве "Создание служб WCF" 579 ст. "Контракт службы не должен содержать более 20 компонентов. Вероятно, на практике верхний предел 12"<br /><br />Как такового четкого ответа почему я не нашел но у меня при [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]<br />уже 45 набралось и разделить возможности нету так как весь замысел что я 1 раз делаю авторизацию и канал живет вечно а я по мере необходимости оповещаю всех кто был авторизован.КВА696https://www.blogger.com/profile/17953548135012988957noreply@blogger.comtag:blogger.com,1999:blog-6254452432891143412.post-17450909055234692382019-04-14T10:07:47.762+03:002019-04-14T10:07:47.762+03:00СпасибоСпасибоКВА696https://www.blogger.com/profile/17953548135012988957noreply@blogger.comtag:blogger.com,1999:blog-6254452432891143412.post-73821541551174018172019-04-11T15:40:09.383+03:002019-04-11T15:40:09.383+03:00Добрый день, рад что нашли что то полезное.
Дело ...Добрый день, рад что нашли что то полезное.<br /><br />Дело в том, что архитектурный подходы у всех разные и по невнимательности или не знанию работы системы при вызове метода сервера сервер, сервер в ответ вызовет callback клиента а клиент снова сервер и т.д. Это приведёт к зацикливанию и зависанию клиент и возможно сервера если исчерпается кол-во maxConcurrentCalls или экземпляров службы если если PerCall. Поэтому стоит продумать возможность такого поведения службы заранее. А если случится повторный вызов и программист поймает исключение, то это может значительно уменьшить головную боль на продашине. А контролировать такое поведение в коде - свихнёшься<br /><br />Я лично сталкивался с зацикливанием. Sergey Vaulinhttps://www.blogger.com/profile/16311012065881214384noreply@blogger.comtag:blogger.com,1999:blog-6254452432891143412.post-7137772826444696402019-04-10T18:36:54.404+03:002019-04-10T18:36:54.404+03:00А в чем разница между ConcurrencyMode.Single и Ree...А в чем разница между ConcurrencyMode.Single и Reentrant <br />У меня сейчас стоит по умолчанию ConcurrencyMode.Single и я пользуюсь callback(методами на стороне клиента), не ужели разница только в том что сервер может сам к себе отключиться и все а смысл? не проще создать общий метод воид и без подключения обойтись?КВА696https://www.blogger.com/profile/17953548135012988957noreply@blogger.comtag:blogger.com,1999:blog-6254452432891143412.post-4634300078712095322019-04-10T17:40:47.601+03:002019-04-10T17:40:47.601+03:00Спасибо то что нужно краткий справочник. А то проч...Спасибо то что нужно краткий справочник. А то прочитал книгу как будто видел фигу так в итоге и не понял по InstanceContextMode, SessionMode и ConcurrencyModeКВА696https://www.blogger.com/profile/17953548135012988957noreply@blogger.comtag:blogger.com,1999:blog-6254452432891143412.post-78237136581865208992019-04-10T17:39:49.387+03:002019-04-10T17:39:49.387+03:00Этот комментарий был удален автором.КВА696https://www.blogger.com/profile/17953548135012988957noreply@blogger.com