Не. Това е широко разбрано погрешно и за съжаление има много погрешна информация.
Първо, "Infinite" е нещо като полувалидна стойност. Има два специални конфигурационни сериализатора, които преобразуват "Infinite" в TimeSpan.MaxValue
или int.MaxValue
(така че те така или иначе не са наистина "безкрайни"), но не всичко в WCF изглежда разпознава това. Така че винаги е най-добре да посочите изрично времето за изчакване с времеви стойности.
Второ, не се нуждаете от метод "keepalive" във вашата услуга, тъй като WCF предоставя това, което се нарича "надеждна сесия". Ако добавите <reliableSession enabled="true" />
, WCF ще предостави свой собствен механизъм за поддържане чрез "инфраструктурни съобщения".
Разполагайки със собствен механизъм за поддържане на активност, вие на практика удвоявате натоварването на вашата услуга и всъщност можете да създадете повече проблеми, отколкото решава.
Трето, когато използвате надеждна сесия, вие използвате настройката inactivityTimeout
на reliableSession
. Това прави две неща. Първо, той контролира колко често се изпращат инфраструктурни (keepalive) съобщения. Те се изпращат на половината от стойността на времето за изчакване, така че ако го зададете на 18 минути, те ще се изпращат на всеки 9 минути. Второ, ако не се получат съобщения за инфраструктура или операция (т.е. съобщения, които са част от вашия договор за данни) в рамките на времето за изчакване на неактивност, връзката се прекъсва, защото вероятно е имало проблем (една страна се е сринала, има мрежов проблем и т.н.). .).
receiveTimeout
е максималният период от време, в който не могат да се получават съобщения за операция, преди връзката да бъде прекратена (по подразбиране е 10 минути). Задаването на това на голяма стойност (Int32.MaxValue
е някъде в близост до 24 дни) поддържа връзката активирана, задаването на inactivityTimeout на по-малка стойност (отново, по подразбиране е 10 минути) (на време, което е по-малко от 2 пъти максималното количество време преди мрежовите рутери да прекъснат връзката от неактивност) поддържа връзката жива.
WCF се справя с всичко това вместо вас. След това можете просто да се абонирате за съобщенията за прекъсната връзка, за да знаете кога връзката е прекъсната поради реални причини (сривове на приложения, изтичане на времето на мрежата, загуба на захранване на клиенти и т.н.) и ви позволява да създадете отново връзките.
Освен това, ако не се нуждаете от подредени съобщения, задайте ordered="false"
, тъй като това значително намалява разходите за надеждни сесии. По подразбиране е вярно.
Забележка: Може да не получите събитие за прекъсване на връзката, докато не изтече inactivityTimeout (или не опитате да използвате връзката). Бъдете наясно с това и задайте съответно времето за изчакване.
Повечето препоръки в интернет са да зададете и receiveTimeout, и inactivityTimeout на Infinite. Това има два проблема, първите инфраструктурни съобщения не се изпращат навреме, така че рутерите ще прекъснат връзката... принуждавайки ви да правите свои собствени keepalive. Второ, голямото време за изчакване на неактивност означава, че няма да разпознае, когато връзката законно прекъсне, и трябва да разчитате на това прекъсване на ping, за да разберете кога възникне грешка. Всичко това е напълно ненужно и може дори да направи услугата ви още по-ненадеждна.
Вижте също това: Как да конфигурирам правилно WCF NetTcp Duplex надеждна сесия?
person
Erik Funkenbusch
schedule
04.11.2014