1. Kas yra "SignalR": ASP.NET SignalR yra klasių biblioteka, skirta supaprastinti kūrėjų tiesioginio žiniatinklio turinio pridėjimo prie programų procesą. Realaus laiko žiniatinklio funkcija reiškia, kad serverio kodas gali bet kada aktyviai siųsti turinį klientams, o ne laukti kliento užklausos (prieš grąžinant turinį). Visas "gyvas" žiniatinklio funkcijas galima pridėti prie ASP.NET programos naudojant "SignalR". Dažniausiai naudojamas pavyzdys yra pokalbių kambariai, tačiau mes galime padaryti daug daugiau. Apsvarstykite šias situacijas: vartotojai turi nuolat atnaujinti tinklalapį, kad pamatytų naujausius duomenis; Arba gauti (ir rodyti) naujus duomenis puslapyje įgyvendindami ilgą apklausą, tada galite apsvarstyti galimybę tai padaryti naudojant SignalR. Pavyzdžiui: prietaisų skydeliai ir stebėjimo programos; Bendradarbiavimo programos (pvz., keli žmonės redaguoja dokumentus vienu metu); Darbo eigos atnaujinimai ir pristatymo formos realiuoju laiku ir kt. "SignalR" taip pat tinka naujesnių tipų žiniatinklio programoms, kurioms reikalingi aukšto dažnio atnaujinimai iš serverio, pvz., žaidimams realiuoju laiku. Štai geras pavyzdys: ShoorR. "SignalR" suteikia paprastą API, leidžiančią vartotojams kurti nuotolinių procedūrų skambučius (RPC), kuriuos galima lengvai pasiekti iš serverio pusės. Grynasis kodas. SignalR taip pat apima ryšius (pvz., ryšio ir atjungimo įvykius) ir ryšių grupavimą.
"SignalR" gali automatiškai valdyti ryšius. Ir leidžia siųsti transliacijos pranešimus visiems prijungtiems klientams, kaip pokalbių kambaryje. Žinoma, be masinio siuntimo, taip pat galite siųsti pranešimus konkretiems klientams. Ryšys tarp kliento ir serverio yra nuolatinis, skirtingai nei tradicinis HTTP protokolas, kuriam reikia iš naujo užmegzti ryšį kiekvienam ryšiui. SignalR palaiko "serverio stūmimo" funkciją, kai serverio kodas gali iškviesti kliento kodą naršyklėje naudojant nuotolinių procedūrų iškvietimus (RPC) vietoj šiuo metu dažniausiai naudojamų užklausų žiniatinklyje - atitinkamą apdorojimo modelį. "SignalR" programas galima išplėsti tūkstančiams klientų naudojant "Service Bus", "SQL SERVER" arba "Redis". "SignalR" yra atvirojo kodo ir jį galima pasiekti per "GitHub".
2. SignalR ir WebSocket
ignalR naudoja WebSocket transportavimo būdą - jei įmanoma. Ir automatiškai perjungti į seną transportavimo būdą (pvz., HTTP ilgą ryšį). Žinoma, galite parašyti savo programą tiesiogiai naudodami "WebSockets", tačiau naudodami "SignalR" turėsite daugiau papildomų funkcijų neišradinėdami rato iš naujo. Svarbiausia, kad galite sutelkti dėmesį į verslo įgyvendinimą, negalvodami apie suderinamo kodo kūrimą atskirai senajam klientui. "SignalR" taip pat leidžia jums nerimauti dėl "WebSocket" atnaujinimų, nes "SignalR" ir toliau bus atnaujinamas, kad palaikytų pagrindinių transportavimo metodų keitimą, kad būtų užtikrinta nuosekli prieigos sąsaja programoms skirtingose "WebSocket" versijose. Žinoma, galite sukurti sprendimą, kuris naudoja tik WebSocket transportą, o SignalR suteikia visas funkcijas, kurių gali prireikti norint parašyti savo kodą, pvz., grįžti prie kitų transportavimo būdų ir modifikuoti programą naujesniems WebSocket diegimams.
3. Transportavimas ir grąžinimas
SignalR yra transporto technologijos, reikalingos realiojo laiko funkcijoms tarp klientų ir serverių įgyvendinti, abstrakcija. SignalR pirmiausia pradeda ryšį su HTTP ir patikrina, ar WebSocket yra prieinamas - jei tikrai, atnaujinkite į WebSocket ryšį. "WebSocket" yra idealiausias "SignalR" perdavimo būdas, nes jis efektyviausiai išnaudoja serverio atmintį, turi mažiausią delsą ir išsamias pagrindines funkcijas (pvz., dvipusį ryšį tarp kliento ir serverio), tačiau taip pat turi griežčiausius reikalavimus: serveris turi naudoti "Windows Server 2012" arba "Windows 8" operacinę sistemą ir tuo pačiu metu. .NET Framework 4.5 ir naujesnės versijos. Jei šie reikalavimai nebus įvykdyti, "SignalR" bandys prisijungti naudojant alternatyvų perdavimo būdą.
4. HTML5 pristatymas
Naudojamas transportavimo būdas priklauso nuo to, ar kliento naršyklė palaiko HTML5, kitaip bus naudojamas senasis transportavimo būdas. WebSocket (jei serveris ir naršyklė palaiko WebSocket). WebSocket yra vienintelis būdas užmegzti tikrą ir patvarų dvipusį ryšį tiek kliento, tiek serverio pusėje. Žinoma, "WebSocket" taip pat turi griežčiausius reikalavimus: jis palaikomas tik naujausiose IE, Chrome ir FF versijose, o kitose naršyklėse, tokiose kaip "Opera" ir "Safari", įdiegtas tik iš dalies. Serveris siunčia įvykius, taip pat žinomus kaip EventSource (jei naršyklė palaiko serverio siuntimo įvykius, iš esmės visos naršyklės, išskyrus IE, palaiko šią funkciją).
5. Kometos perdavimas
Šie transportavimo tipai yra pagrįsti "Comet" žiniatinklio programos modeliu, kai naršyklė arba klientas palaikys ilgą HTTP ryšio užklausą, o serveris gali perduoti duomenis klientui be aiškaus kliento prašymo. "Forever Frame" (tik IE) "Forever Frame" sukurs paslėptą "IFrame", kuris siunčia užklausą į serverį, kuri nebus užbaigta. Tada serveris nuolat siunčia scenarijus klientui, o klientas juos nedelsdamas vykdo, t. y. vienpusis ryšys realiuoju laiku iš serverio į klientą. Kliento ir serverio ryšys naudoja kitą ryšį nei šis ryšys. Pavyzdžiui, standartinė HTML užklausa sukuria naują ryšį kiekvienam siunčiamam duomenims. "Ajax" ilgoji apklausa nesukuria nuolatinio ryšio, o apklausos nuolat pateikia užklausas serveriui. Palaukite, kol serveris atsakys ir uždarys šį ryšį kiekviename ryšyje, tada nedelsdami pateikite naują užklausą. Žinoma, tai šiek tiek vėluos, kai ryšys bus nustatytas iš naujo ir vėl prijungtas. Informacijos apie transportavimo būdus, kuriuos palaiko įvairios konfigūracijos, ieškokite Palaikomos platformos. (IE reikalauja 8 ar daugiau, kitos naršyklės yra dabartinė versija -1) Perkėlimo metodo pasirinkimo procesas Šiame sąraše parodyta, kaip "SignalR" nusprendžia, kurį tipą naudoti perdavimui. IE8 ir senesnėse versijose naudokite ilgą apklausą. Jei JSONP sukonfigūruotas (t. y. jungiantis jsonp parametras nustatytas kaip true), naudokite ilgą apklausą. Jei naudojate kryžminį domenų ryšį (t. y. "SignalR" galinis punktas ir puslapis nėra tame pačiame domene), naudokite "WebSockets", jei tenkinamos šios sąlygos: Klientas palaiko Cross-Domain Resource Sharing (CORS), daugiau informacijos rasite CORS adresu Klientas palaiko WebSocket Serveris palaiko WebSocket Jei kuri nors iš aukščiau išvardytų sąlygų neįvykdyta, naudojama ilga apklausa. Daugiau informacijos apie kryžminius domenų ryšius rasite Kaip užmegzti kryžminius ryšius. Jei nesukonfigūruojate JSONP naudojimo ir ryšys nėra kryžminis domenas, žinoma, naudokite "WebSocket", jei klientas ir serveris palaiko "WebSocket". Jei klientas arba serveris nepalaiko WebSockets, naudokite serverį įvykiams siųsti. Jei serveris siunčia įvykį nepasiekiamas, naudokite "Forever Frame". Jei "Forever Frame" nėra, naudokite ilgą apklausą. Stebėkite perdavimą Galite pamatyti, kokį transportavimo būdą naudoja jūsų programa, įjungę koncentratoriaus registravimą ir naršyklės konsolėje. Norėdami įjungti registravimą, į kliento programą įtraukite šią komandą: nnection.hub.logging = teisinga;
6. Apžiūra ir transportavimas:
Galite pamatyti, kokį transportavimo būdą naudoja jūsų programa, įjungę koncentratoriaus registravimą ir naršyklės konsolėje. Norėdami įjungti registravimą, į kliento programą įtraukite šią komandą: nnection.hub.logging = teisinga; $.connection.hub.logging = teisinga; IE paspauskite F12, kad atidarytumėte kūrėjo įrankius, ir spustelėkite skirtuką Konsolė.
Naršyklėje "Chrome" paspauskite Ctrl + Shift + J, kad atidarytumėte konsolę
Stebėdami prisijungimą konsolėje, galite pamatyti perdavimo būdą, kurį naudoja "SignalR".
7. Paskirtasis pristatymas:
Derybos dėl perdavimo būdo reikalauja tam tikro laiko ir serverio/kliento resursų. Jei kliento aplinka yra žinoma, transportavimo būdą galima nurodyti, kai užmezgamas ryšys, kad būtų pagerintas našumas. Šis kodas parodo, kaip naudoti ilgą "Ajax" apklausą tiesiogiai inicijuojant ryšį, jei žinoma, kad klientas palaiko bet kurį kitą protokolą: connection.start({ transport: 'longPolling' }); Jei norite, kad klientas derėtųsi dėl transportavimo konkrečia tvarka, galite nurodyti tvarką, kuria bandoma derėtis. Žemiau pateiktas kodas parodo, kaip pirmiausia pabandyti naudoti "WebSockets" ir naudoti ilgą apklausą iškart po nesėkmės. connection.start({ transport: ['webSockets','longPolling'] }); Vartotojo nurodytos eilutės konstantos apibrėžiamos taip: webSockets forverFrame serverSentEvents longPolling
8. Ryšiai ir šakotuvai "SignalR" API apima du kliento ir serverio ryšio modelius: nuolatinius ryšius ir šakotuvus.
Ryšys yra paprastas galinis punktas, skirtas siųsti vieną, sugrupuotą arba transliuojamą pranešimą. "PersistentConnection" API (atstovaujama "PersistentConnection" klase .NET kode) suteikia kūrėjams tiesioginę prieigą prie pagrindinio "SignalR" ryšio protokolo. Kūrėjai, kurie naudojo ryšiu pagrįstas API, pvz., WCF, bus geriau susipažinę su ryšio ryšio modeliu. Šakotuvai yra API pagrįsti, bet aukštesnio lygio ryšio vamzdynai, leidžiantys klientams ir serveriams iškviesti metodus tiesiogiai vienas kitam. "SignalR" puikiai tvarko kelių mašinų planavimą, todėl klientai gali lengvai iškviesti metodus serveryje taip, lyg jie skambintų vietiniams metodams, ir atvirkščiai. Kūrėjai, kurie naudojo nuotolinius skambučius pagrįstus AIP, tokius kaip .Net Remoting, bus geriau susipažinę su šakotuvo modeliu. Naudodami šakotuvą, taip pat galite perduoti stipriai įvestus parametrus metodams ir susieti juos su modeliu.
Architektūros diagrama: Žemiau esančioje diagramoje parodytas ryšys tarp šakotuvo, nuolatinio ryšio ir pagrindinės transportui naudojamos technologijos.
9. Kaip veikia centras:
Kai serverio kodas iškviečia klientą, serveris klientui išsiųs paketą, kuriame yra iškvietimo metodas ir parametrai (kai objektas naudojamas kaip metodo parametras, jis bus siunčiamas kaip JSON). Tada klientas patikrina gautą metodo pavadinimą ir atlieka atitikties paiešką kliento apibrėžtame metode, o jei atitiktis sėkminga, metodas vykdomas ir deserializuotas objektas naudojamas kaip metodo parametras. Galite naudoti tokius įrankius kaip "Fiddler", kad stebėtumėte metodo skambučio vykdymą. Šiame paveikslėlyje parodytas metodas, užfiksuotas iš "Fiddler" žurnalų, siunčiamas iš "SignalR" serverio į žiniatinklio naršyklės klientą. Metodas, inicijuotas iš koncentratoriaus, vadinamas MoveShapeHub, o metodas vadinamas updateShape.
Šiame pavyzdyje šakotuvo pavadinimas identifikuojamas su parametru "H", metodo pavadinimas identifikuojamas su parametru "M", o parametro objektas, siunčiamas į metodą, identifikuojamas su parametru "A". Pranešimą, sugeneravusi programą, buvo įdiegta aukšto dažnio realaus laiko komunikacijos pamokoje. Pasirinkite komunikacijos modelį: Dauguma programų naudoja koncentratoriaus API, kurią galima naudoti šiose situacijose: Turite nurodyti pranešimo siuntimo formatą. Kūrėjai nori naudoti pranešimų ir planavimo modelį, o ne nuotolinio skambučio modelį Pranešimų modelis naudojamas esamose programose ir planuojama jį perkelti į "SignalR".
|