În acest tutorial, vă voi învăța cum să scrieți un widget Twitter pentru ASP.NET sub forma unui control al serverului reutilizabil, completat de lucruri frumoase, cum ar fi transformarea automată a adreselor URL în linkuri și cache-ul pentru a accelera încărcarea paginilor.
Pentru a urma acest tutorial, tot ce aveți nevoie este Visual Studio (Puteți utiliza MonoDevelop dacă nu sunteți pe Windows, deși nu există nici o garanție acolo). Dacă nu doriți să fi furculiță peste bani pentru versiunea completă a Visual Studio, tu poate lua gratuit Express Edition.
De asemenea, veți avea nevoie de cunoștințe despre C # 3.0, deoarece acest tutorial folosește unele dintre noile caracteristici ale limbii, cum ar fi expresiile lambda și var cuvinte cheie.
ASP.NET include o caracteristică la îndemână, cunoscută sub numele de Control de server. Acestea sunt etichete personalizate care vizează să ajute dezvoltatorii să structureze codul lor. Când se solicită o pagină care utilizează un control de server, execuția ASP.NET execută Face() și include rezultatul în pagina finală.
Odată ce ați creat o nouă aplicație Web în Visual Studio, faceți clic dreapta în Solution Explorer și adăugați un element nou la soluție. Selectați Control ASP.NET Server și dați-i un nume. Aici, l-am sunat Twidget.cs, dar ești binevenit să-i spui ceea ce îți place. Inserați codul următor și nu vă faceți griji dacă totul pare puțin străin - vă voi explica în scurt timp.
utilizând Sistemul; folosind System.Collections.Generic; folosind System.Linq; utilizând System.Web; utilizând System.Web.UI; folosind System.Web.Script.Serialization; utilizând System.Net; spațiul de nume WebApplication1 public class Twidget: Control public string Cont get; a stabilit; public int Tweets get; a stabilit; suprascriere protejată void Render (scriitor HtmlTextWriter) writer.Write ("
Acest lucru este la fel de bază ca puteți obține pentru un widget Twitter. Iată cum funcționează:
Când un utilizator solicită o pagină cu acest control pe acesta, Face() metoda se execută cu un HtmlTextWriter trecut ca parametru. Se scrie și apoi intră într-o buclă care imprimă fiecare tweet ca element de listă. Magia se petrece aici în GetTweets () metodă. Observați cum folosim Lua() pentru a vă asigura că tipărim numai cantitatea de tweete pe care suntem rugați.
Odată ce execuția trece la GetTweets () metodă, vom configura a Listă> string< să ne ținem tweets și a JavaScriptSerializer pentru a analiza JSON-ul de pe serverele API Twitter. Declarația de pe liniile 31 - 34 (împărțită pentru citire) retrimite cronologia utilizatorului în format JSON, apoi deserializează în tipurile .NET cu care putem lucra. Pe linia 36, vom trece prin toate tweets și le adăugăm una câte una în lista tweet. Trebuie să aruncăm manual x [ "text"] la a şir pentru că l-am deserializat ca pe un obiect. A trebuit să facem acest lucru, deoarece JSON-ul returnat de Twitter API folosește un tablou de diferite tipuri - ceea ce este bine pentru JavaScript, dar un pic mai dificil cu C #.
Acum avem codul pentru widgetul nostru Twitter; haideți să o folosim! Deschide-ți default.aspx (sau oricare dintre paginile pe care doriți să le utilizați) și plasați următorul cod imediat după <%@ Page %> directivă:
<%@ Register TagPrefix="widgets" Namespace="WebApplication1" Assembly="WebApplication1" %>
Simțiți-vă liber să schimbați TagPrefix la ceea ce vă place, dar asigurați-vă că namespace atributul este setat corect la orice spațiu de nume pe care ați plasat codul widget și asigurați-vă că acesta este Asamblare atributul este setat la numele aplicației dvs. web (în cazul nostru, WebApplication1).
Odată ce ați înregistrat prefixul corespunzător al etichetei (și va trebui să faceți acest lucru pentru fiecare pagină pe care doriți să o utilizați), puteți să-l utilizați. Inserați următorul cod undeva în pagina dvs. și, din nou, nu ezitați să modificați atributele la ceea ce doriți:
Dacă ați făcut totul în mod corespunzător, ar trebui să vedeți o pagină asemănătoare cu aceasta atunci când executați aplicația web:
Trebuie să recunoașteți că controlul pe care îl avem în acest moment este destul de rudimentar. Nu trebuie să fie, de aceea, haideți să-i împrăștiem un pic transformând URL-urile în linkuri frumoase, clickabile pentru vizitatorii dvs..
Găsiți buclă de foreach în Face() și eliminați-l complet. Înlocuiți-l cu acesta:
// va trebui să adăugați această directivă utilizând directiva în partea de sus a fișierului: utilizând System.Text.RegularExpressions; (t), "[az] +: // [^ \ s] +", x => "Încărcați (Tweets)) string s = Regex.Replace (HttpUtility.HtmlEncode "+ x.Value +" ", RegexOptions.Compiled | RegexOptions.IgnoreCase); writer.Write (“
Totul este aproape același cod, cu excepția apelului humongos Regex.Replace () pe linia 6. Voi explica ce face asta.
Primul parametru este intrarea sau șirul pe care rulează Regex. În acest caz, este doar textul tweet după ce a trecut HttpUtility.HtmlEncode () așa că nu cad victimă unui atac XSS vicios. Intrarea este apoi potrivită cu cel de-al doilea parametru, care este o expresie regulată concepută pentru a se potrivi cu o adresă URL.
Al treilea parametru este locul în care se implică puțin. Aceasta este o expresie lambda, o caracteristică nouă pentru C # 3. Este practic o modalitate foarte scurtă de a scrie o metodă ca aceasta:
string public static SomeFunction (Match x) return "" + x.Value + "";
Tot ce face este să înfășurați adresa URL cu un tag, din care toate ghilimelele din adresa URL sunt înlocuite cu entitatea HTML ", care ajută la prevenirea atacurilor XSS. Parametrul al patrulea și ultimul este doar unul SAUed împreună pereche de steaguri ajustând felul în care se comportă regexul nostru.
Ieșirea controlului după efectuarea acestei ajustări este oarecum similară cu ecranul de mai jos.
Există o mare problemă cu codul pe care vi l-am dat mai sus și că nu cachează răspunsul din API-ul Twitter. Aceasta înseamnă că de fiecare dată când cineva încarcă pagina dvs., serverul trebuie să facă o cerere către API-ul Twitter și să aștepte un răspuns. Acest lucru poate încetini dramatic timpul de încărcare a paginii dvs. și vă poate lăsa și mai vulnerabil la un atac Denial of Service. Din fericire, putem rezolva toate acestea prin implementarea unei cache-uri.
Deși structura de bază a codului de control rămâne după implementarea memoriei cache, sunt prea multe modificări minore pe listă, așa că vă voi da sursa completă și apoi - ca de obicei - explicați cum funcționează.
utilizând Sistemul; folosind System.Collections.Generic; folosind System.Linq; utilizând System.Web; utilizând System.Web.UI; folosind System.Web.Script.Serialization; utilizând System.Net; folosind System.Threading; utilizând System.Text.RegularExpressions; spațiul de nume WebApplication1 public class Twidget: Control public string Cont get; a stabilit; public int Tweets get; a stabilit; public int CacheTTL get; a stabilit; dicționar static>> Cache = dicționar nou >> (); protejată suprascriere void Render (writer HtmlTextWriter) writer.Write (" "())), foreach (var t în GetTweets () luați (Tweets)) string s = Regex.Replace (HttpUtility.HtmlEncode (t), @ => "" + x.Value + "", RegexOptions.Compiled | RegexOptions.IgnoreCase); writer.Write ("
"); Listă publică- 0
", s); writer.Write ("GetTweets () if (! Cache.Keys.Contains (Cont) || (DateTime.Now - Cache [Account]. Timp) .TotalSeconds> CacheTTL) nou Subiect (Update) .Start (Cont); dacă (! Cache.Keys.Contains (Account)) returnează o nouă listă (); returnează memoria cache [cont]. date; public static void Actualizare (obiect acc) try string Cont = (string) acc; var ls = lista nouă (); var jss = noul JavaScriptSerializer (); var d = jss.Deserializați >> (nou WebClient () .DownloadString ("http://api.twitter.com/1/statuses/user_timeline.json?screen_name=" + cont)); foreach (var x în d) ls.Add ((șir) x ["text"]); dacă (! Cache.Keys.Contains (Cont)) Cache.Add (Account, new CachedData
> ()); Cache [Cont] .Data = ls; captură (excepție) clasa CachedData
public DateTime Time get; set privat; Date T; publice T Data get return date; set Time = DateTime.Now; date = valoare;
După cum puteți vedea, Face() metoda rămâne neschimbată, dar există schimbări destul de drastice oriunde altundeva. Am schimbat-o GetTweets () , a adăugat o nouă proprietate (CacheTTL), a adăugat un câmp privat static (ascunzătoare), și există chiar o clasă cu totul nouă - Date păstrate.
GetTweets () metoda nu mai este responsabil pentru a vorbi cu API. În schimb, returnează datele stocate deja în memoria cache. Dacă detectează că contul Twitter solicitat nu a fost încă stocat în cache sau este depășit (puteți specifica cât timp este nevoie ca memoria cache să expire în CacheTTL atribut al controlului), va produce o fire separată pentru a actualiza asincron cache-ul tweet. Rețineți că întregul corp al elementului Actualizați() metoda este închisă într-un bloc try / catch, deoarece, deși o excepție în fișierul Pagină afișează doar un mesaj de eroare pentru utilizator, dacă se produce o excepție într-un alt fir, acesta va deconecta tot drumul înapoi la stivă și eventual va prăbuși întregul lucrător responsabil pentru difuzarea aplicației dvs. web.
Cache-ul tweet este implementat ca un a Dicţionar
Puteți utiliza codul următor în pagina dvs. pentru a utiliza această versiune cache a widget-ului. Rețineți că noul CacheTTL atributul stabilește expirarea (în secunde) a cache-ului tweet.
Sper că acest tutorial nu numai că te-a învățat cum să faci un widget Twitter, dar ți-a oferit o perspectivă asupra modului în care funcționează controalele serverului, precum și a unor bune practici atunci când scanezi date din surse externe. Îmi dau seama că ieșirea browserului acestui control nu este exact cea mai frumoasă, dar am simțit că aranjarea ei și făcând-o să arate frumos nu se aflau în sfera de aplicare a articolului și, prin urmare, a rămas ca un exercițiu pentru cititor. Vă mulțumim pentru lectură! Simțiți-vă liber să puneți întrebările pe care le puteți avea în secțiunea de comentarii de mai jos.