In questo tutorial ti spiegherò come scrivere un widget Twitter per ASP.NET sotto forma di un controllo server riutilizzabile completo di cose carine come trasformare automaticamente gli URL in link e il caching per accelerare i tempi di caricamento delle pagine.
Per seguire questo tutorial, tutto ciò che serve è Visual Studio (puoi usare MonoDevelop se non sei su Windows, anche se non ci sono garanzie lì.) Se non vuoi sborsare soldi per la versione completa di Visual Studio, puoi prendere l'Express Edition gratuita.
Avrai anche bisogno della conoscenza di C # 3.0, poiché questo tutorial utilizza alcune delle nuove funzionalità del linguaggio, come le espressioni lambda e il var parola chiave.
ASP.NET include una comoda funzionalità nota come Controlli server. Si tratta di tag personalizzati che mirano ad aiutare gli sviluppatori a strutturare il loro codice. Quando viene richiesta una pagina che utilizza un controllo server, il runtime ASP.NET esegue il Render () metodo e include l'output nella pagina finale.
Dopo aver creato una nuova applicazione Web in Visual Studio, fare clic con il tasto destro del mouse su Solution Explorer e aggiungere un nuovo elemento alla soluzione. Selezionare Controllo server ASP.NET e assegnargli un nome. Ecco, l'ho chiamato Twidget.cs, ma puoi chiamarlo come preferisci. Incolla il seguente codice e non preoccuparti se tutto sembra un po 'estraneo - Spiegherò tutto a breve.
usando il sistema; using System.Collections.Generic; using System.Linq; usando System.Web; usando System.Web.UI; utilizzando System.Web.Script.Serialization; usando System.Net; namespace WebApplication1 public class Twidget: Control public string Account get; impostato; public int Tweets get; impostato; protected override void Render (HtmlTextWriter writer) writer.Write ("
Questo è fondamentale come puoi ottenere per un widget di Twitter. Ecco come funziona:
Quando un utente richiede una pagina con questo controllo su di essa, il Render () il metodo viene eseguito con a HtmlTextWriter passato come parametro. Scrive il tag, quindi entra in un ciclo che stampa ciascun tweet come elemento della lista. La magia qui accade nel GetTweets () metodo. Nota come stiamo usando il Prendere() metodo di estensione per assicurarci di stampare solo la quantità di tweet che ci viene richiesta.
Una volta che l'esecuzione passa al GetTweets () metodo, abbiamo impostato a Lista> string< tenere i nostri tweets e a JavaScriptSerializer analizzare il JSON dai server API di Twitter. La dichiarazione alle righe 31 - 34 (suddivisa per leggibilità) riporta la timeline dell'utente in formato JSON, quindi deserializza in tipi .NET con cui possiamo lavorare. Alla riga 36, passiamo in rassegna tutti i tweet e li aggiungiamo uno alla volta nell'elenco dei tweet. Dobbiamo lanciare manualmente x [ "testo"] a a stringa perché lo abbiamo deserializzato come un oggetto. Dovevamo fare questo, perché il JSON restituito dall'API di Twitter utilizza un pannello di smistamento di diversi tipi - che va bene per JavaScript, ma un po 'complicato con C #.
Ora abbiamo il codice per il nostro widget Twitter; mettiamola per usare! Apri i tuoi Default.aspx pagina (o qualsiasi pagina in cui si desidera utilizzare questo in) e inserire il seguente codice immediatamente dopo il <%@ Page %> direttiva:
<%@ Register TagPrefix="widgets" Namespace="WebApplication1" Assembly="WebApplication1" %>
Sentiti libero di cambiare il TagPrefix a qualsiasi cosa ti piaccia, ma assicurati che il Spazio dei nomi l'attributo è impostato correttamente su qualsiasi spazio dei nomi in cui è stato inserito il codice del widget e assicurarsi che montaggio l'attributo è impostato sul nome della tua applicazione web (nel nostro caso, WebApplication1).
Una volta registrato il prefisso del tag appropriato (e dovrai farlo per ogni pagina in cui desideri utilizzare il controllo), puoi iniziare a usarlo. Incolla il seguente codice da qualche parte nella tua pagina, e ancora una volta, sentiti libero di cambiare gli attributi in qualunque cosa desideri:
Se hai fatto tutto correttamente, dovresti vedere una pagina simile a questa quando esegui la tua applicazione web:
Devi ammettere che il controllo che abbiamo al momento è piuttosto rudimentale. Non deve essere però, quindi diamo un po 'di risalto trasformando gli URL in link piacevoli e cliccabili per i tuoi visitatori.
Trova il ciclo di foreach in Render () metodo e scaricalo completamente. Sostituiscilo con questo:
// dovrai aggiungere questo usando la direttiva all'inizio del file: using System.Text.RegularExpressions; foreach (var in GetTweets (). Take (Tweets)) string s = Regex.Replace (HttpUtility.HtmlEncode (t), @ "[az] +: // [^ \ s] +", x => " "+ x.Value +" ", RegexOptions.Compiled | RegexOptions.IgnoreCase); writer.Write ("
È tutto più o meno lo stesso codice, fatta eccezione per l'enorme chiamata a Regex.Replace () sulla linea 6. Spiegherò cosa fa.
Il primo parametro è l'input o la stringa su cui lavora il Regex. In questo caso, è solo il testo tweet dopo essere passato attraverso HttpUtility.HtmlEncode () quindi non cadiamo vittima di un attacco XSS vizioso. L'input viene quindi confrontato con il secondo parametro che è un'espressione regolare progettata per corrispondere a un URL.
Il terzo parametro è dove diventa un po 'coinvolto. Questa è un'espressione lambda, una novità del C # 3. È fondamentalmente un modo molto breve per scrivere un metodo come questo:
public static string SomeFunction (Match x) return "" + x.Value + "";
Tutto ciò che fa è racchiudere l'URL con un tag, di cui tutte le virgolette nell'URL sono sostituite con l'entità HTML ", che aiuta a prevenire gli attacchi XSS. Il quarto e ultimo parametro è solo un Oinsieme una coppia di bandiere che regolano il modo in cui si comporta la nostra regex.
L'output del controllo dopo aver effettuato questa regolazione è in qualche modo simile allo screenshot qui sotto.
C'è un grosso problema con il codice che ti ho dato sopra, e cioè che non memorizza nella cache la risposta dall'API di Twitter. Ciò significa che ogni volta che qualcuno carica la tua pagina, il server deve fare una richiesta all'API di Twitter e attendere una risposta. Questo può rallentare notevolmente il tempo di caricamento della pagina e può anche renderti ancora più vulnerabile a un attacco di tipo Denial of Service. Per fortuna, possiamo aggirare tutto questo implementando un cache.
Sebbene la struttura di base del codice del controllo rimanga dopo l'implementazione del caching, ci sono troppe piccole modifiche da elencare, quindi ti fornirò l'intera fonte e poi, come al solito, spiegherò come funziona.
usando il sistema; using System.Collections.Generic; using System.Linq; usando System.Web; usando System.Web.UI; utilizzando System.Web.Script.Serialization; usando System.Net; using System.Threading; using System.Text.RegularExpressions; namespace WebApplication1 public class Twidget: Control public string Account get; impostato; public int Tweets get; impostato; public int CacheTTL get; impostato; Dizionario statico>> Cache = nuovo dizionario >> (); protected override void Render (HtmlTextWriter writer) writer.Write (" "); foreach (var in GetTweets (). Take (Tweets)) string s = Regex.Replace (HttpUtility.HtmlEncode (t), @" [az] +: // [^ \ s] + ", x => "" + x.Valore + "", RegexOptions.Compiled | RegexOptions.IgnoreCase); writer.Write ("
"); Elenco pubblico- 0
", s); writer.Write ("GetTweets () if (! Cache.Keys.Contains (Account) || (DateTime.Now - Cache [Account] .Time) .TotalSeconds> CacheTTL) new Thread (Aggiorna) .Start (Account); se (! Cache.Keys.Contains (Account)) restituisce una nuova lista (); return Cache [Account] .Data; public static void Update (object acc) try string Account = (string) acc; var ls = new List (); var jss = new JavaScriptSerializer (); var d = jss.Deserialize >> (nuovo WebClient () .DownloadString ("http://api.twitter.com/1/statuses/user_timeline.json?screen_name=" + Account)); foreach (var x in d) ls.Add ((stringa) x ["testo"]); if (! Cache.Keys.Contains (Account)) Cache.Add (Account, new CachedData
> ()); Cache [Account] .Data = ls; catch (Exception) classe CachedData
public DateTime Time get; set privato; T data; dati T pubblici ottieni dati di ritorno; set Time = DateTime.Now; data = valore;
Come puoi vedere, il Render () metodo rimane invariato, ma ci sono alcuni cambiamenti drastici ovunque. Abbiamo cambiato il GetTweets () metodo, ha aggiunto una nuova proprietà (CacheTTL), ha aggiunto un campo statico privato (nascondiglio), e c'è persino una nuova classe - CachedData.
Il GetTweets () il metodo non è più responsabile per parlare con l'API. Invece, restituisce solo i dati già presenti nella cache. Se rileva che l'account Twitter richiesto non è ancora stato memorizzato nella cache, o è scaduto (è possibile specificare quanto tempo ci vuole perché la cache scada nel CacheTTL attributo del controllo), genererà un thread separato per aggiornare in modo asincrono la cache del tweet. Si noti che l'intero corpo del Aggiornare() il metodo è racchiuso in un blocco try / catch, come se un'eccezione nel thread Page visualizza semplicemente un messaggio di errore all'utente, se si verifica un'eccezione in un altro thread, si aprirà completamente lo stack e alla fine arresterà l'intero processo di lavoro responsabile per servire la tua applicazione web.
Il tweet cache è implementato come un Dizionario
È possibile utilizzare il codice seguente nella pagina per utilizzare questa versione di cache del widget. Si noti che il nuovo CacheTTL attributo imposta la scadenza (in secondi) della cache del tweet.
Spero che questo tutorial non solo ti abbia insegnato come creare un widget su Twitter, ma ti ha dato un'idea di come funzionano i controlli dei server e alcune best practice quando "impasti" i dati da fonti esterne. Mi rendo conto che l'output del browser di questo controllo non è esattamente il più bello, ma ho sentito che lo stile e il suo aspetto bello era al di fuori del campo di applicazione dell'articolo e quindi è stato lasciato come esercizio per il lettore. Grazie per aver letto! Sentiti libero di fare tutte le domande che potresti avere nella sezione commenti qui sotto.