SignalR primi passi: Log viewer in Realtime con Log4Net

Per lavoro ho iniziato a muovere i primi passi con SignalR. SignalR è una libreria che crea una persistent connection tra client e server, permettendo al server di inviare al client dati in modalita push. Crea inoltre un’astrazione sulla modalità di trasporto adottata (periodic polling, long polling & websockets), e fornisce un’unica interfaccia di programmazione.
Ma perche’ utilizzarla?  Un’applicazione necessita del real-time perché ci sono situazioni in cui i dati visualizzati devono essere aggiornati costantemente (in modalita push). Un caso emblematico può essere quello delle quotazioni di borsa. 

Il web è basato sul protocollo HTTP, che per sua natura è request/response. Pertanto, ci troviamo ad utilizzare un protocollo unidirezionale senza stato (ovvero che non permette di fare delle chiamate push server-to-client in maniera nativa). Per utilizzare una modalità push, quindi, dobbiamo ricorrere ad alcuni workaround. Ci sono molti siti ufficiali, blog, tutorial, etc. per documentarsi. Questo e’ solo il mio primo esempio.

La parte di configurazione ed installazione la lascio al sito microsoft…  Il progetto che presentero’ e’ una banale  console per visualizzare log in real time da diverse fonti, in questo caso da diverse webApi.

Ci sono 3 livelli di log (lOG4nET): debug, info, error. In SignalR, ogni livello di log è che sia proprio gruppo.  L’interfaccia utente consente all’utente di passare ogni livello. Ogni livello di log e’ associato ad un’attivita’ di SignalR. L’implementazione finale e’ semplice:  Quando il logger ricerve un messaggio, lo trasmette al gruppo associato. Ogni metodo di log chiama Log(string level, string message):

public void Log(string loglevel, string message)
{

     Log(new LogItem() { Level = loglevel, Message = message });
}
private void Log(LogItem item)
{
     IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
     dynamic clients = connectionManager.GetClients<LogEndpoint>();
     clients[item.Level].receiveLogEntry(item);
}

L’hub espone 2 metodi: WatchLevel(string) and UnwatchLevel(string) which add the current connection to the group.

public void WatchLevel(string level)
{
     if (LogLevels.Contains(level))
     {
          AddToGroup(level);
     }
}

public void UnwatchLevel(string level)
{
     if (LogLevels.Contains(level))
     {
          RemoveFromGroup(level);
     }
}

Il frontend ha un metodo principale chiamato receiveLogEntry che accetta un LogItem come parametro.
LogItem è un semplice POCO con Timstamp, livello, e proprietà del messaggio.
I nuovi messaggi vengono anteposti alla tabella o aggiunti alla console a seconda della vista.

Quanto detto e’ il funzionamento di base.
Nel progetto ho aggiunto un paio di cose come la codifica a colori dei messaggi di errore
e una semplice scroll automatica ed un elenco di connessioni correnti e di
registrazione semplici in tutta l’applicazione.

Questo e’ un semplice punto di partenza per avere un log centralizzato. A questo link e’ possibile fare il download del
progetto github qui.

Annunci

No more IIS7 WCF REST 404 Error!

imagesRecently I’ve been trying to host a WCF REST .NET 4.0 service in IIS7. I downloaded the template for VS2010 used for creating REST services. Running the sample application found on that website worked fine from VS2012. I then switched to hosting the service in IIS7. The result however was a 404 error, not exactly what I was hoping for. I tried on other computer the same thing on his machine with complete success. I looked at the service configuration, IIS7 settings, among other obscure settings without success. Google wasn’t especially helpful since most of the results kept saying things like “add an *.svc file” (which is not required/used in .NET 4.0 REST services), others mentioned changing an IIS7 handler mapping so that the *.svc file would not be required, but none of these solutions helped. Tracing didn’t help me get any closer either.

Still the problem felt like a server issue, so I tried to narrow the search. I eventually came across this blog. There was a link to a question on the MSDN forums that mentions a handler mapping named “svc-Integrated-4.0″. When I looked at my handler mappings in IIS7 it did not contain that mapping. The last post on that question contained a link to the MSDN post One-Time Setup Procedure for the Windows Communication Foundation Samples explaining some steps that need to be taken in order to use the .NET 4.0 WCF services in IIS7.  I followed all procedure that I found on this last link and it’s run. The problem was a wrong installation of Asp.net.

That’s all!

Utilizzare WordPress con C#

imagesFinalmente ho deciso (e trovato il tempo) di creare il mio sito personale (ormai tutti hanno un sito personale 🙂 ).

In home page voglio dare la possibilita’ di visualizzare i post principali che scrivo su wordpress; per fare questo ho pensato a diverse soluzioni:

  • converto tutto in .NEt sbarazzandomi di WordPress
  • decido di utilizzare wordpress sui miei server e quindi avere controllo anche del database (in questo modo posso fare le query direttamente sul db)
  • cerco su internet qualche plugin o framework che mi possa aiutare ad integrare wordpress nel mio sito.
  • utilizzare webhooks per pushare le informazioni direttamente dal blog di WordPress
  • dato che voglio solo visualizzare i miei posts e non voglio inserire post direttamente da .net, si puo’ leggere direttamente rss feed che rendo disponibile da mio sito.

Per adesso ho deciso di utilizzare l’ultima possibilita’: meno costosa (gratis)… piu’ semplice da utilizzare e piu’ veloce da fare.

Prima di tutto creiamo il modello di oggetto che identifica il  POST:

public class Post
{
   public string Title { get; set; }
   public string Url { get; set; }
   public string Author {get; set;}
   public DateTime PublishedDate { get; set; }
}

Adesso andiamo a leggere i post dal link del mio rss feed di wordpress. Ho creato un semplice parser per leggere queste informazioni:

public static IList GetBlogPosts(string postUrl, int postCount)
{

string xml;

using (WebClient downloader = new WebClient())
{
   using (TextReader reader =
      new StreamReader(downloader.OpenRead(postUrl)))
{
xml = reader.ReadToEnd();
}
}
// Sanitize the XML
xml = XmlCommon.SanitizeXmlString(xml);
XmlDocument xmlDoc = new XmlDocument();
//Load feed via a feedUrl.
TextReader tr = new StringReader(xml);
var doc = XDocument.Load(tr);

XNamespace dc= "http://purl.org/dc/elements/1.1/";

//Get all the "items" in the feed.
var feeds = doc.Descendants("item").Select(x =>
new Post
{
//Get title, pubished date, and link elements.
Title = x.Element("title").Value, //3
PublishedDate = DateTime.Parse(x.Element("pubDate").Value),
Author = x.Element(dc + "creator").Value,
Url = x.Element("link").Value
} //  Put them into an object (Post)
)
// Order them by the pubDate (Post.PublishedDate).
.OrderByDescending(x=> x.PublishedDate)
//Only get the amount specified, the top (1, 2, 3, etc.) via postCount.
.Take(postCount);

//Convert the feeds to a List and return them.
return feeds.ToList();
}

Volevo farvi notare la seguente riga di codice:

xml = XmlCommon.SanitizeXmlString(xml);

In questo modo andremo a ripulire il nostro XML. Il file rss di wordpress viene creato con dei caratteri non validi per le specifiche XML.Qui trovate un articolo che spiega meglio il pattern utilizzato.

Infine se potremmo anche creare una cache per non rallentare il caricamento. Ecco qualche lineea di codice:

//Check if feed exists
if (HttpRuntime.Cache["WordPressPost"] == null)
				{
					//If it is, insert it into the cache, cache for 10 minutes
					HttpRuntime.Cache.Insert("WordPressPost",
						FeedReader.GetBlogFeed("url", 5), null, SystemTime.Now().AddMinutes(10), Cache.NoSlidingExpiration);
				}

//retrieve cached feeds
var cachedFeeds = (List) HttpRuntime.Cache["WordPressPost"]

Ora possiamo avere i nostri post di worpress nella nostra homepage. Ho creato un piccolo progetto di esempio in Github

Cercando su google ho trovato WP.NET e un ottimo articolo sol suo utilizzo : Extending-WordPress-with-Csharp-Plugins. Con WP.Net e’ possibile utilizzare wordpress con .net.

Inserire un “confirm messagebox” ad un Asp.net Button control

A my colleague asked my a way to create a confirm button in Asp.net. This is the solution:

The Asp.Net button has 2 attributes to trigger a click event OnClick and OnClientClick.

OnClientClick – Calls the client side (JavaScript) event handler
OnClick– Calls the server side (code-behind) event handler

The OnClientClick event handler can be used to perform client side validations and to get a confirmation from the user before triggering the server side event handler as follows.

OnClientClick="if(!confirm('Are you sure you want to Save?')) return false;"
<html>
<head runat="server">
    <title>OnClientClick</title>
</head>
<body>
    <form id="frmOnClientClick" runat="server">
    <div>
        <asp:Button
            id="btnSave"
            runat="server"
            Text="Client Click"
            OnClientClick="if(!confirm('Are you sure you want to Save?'))  
            return false;"
            onclick="btnSave_Click"/>
    </div>
    </form>
</body>
</html>

What do you think?

Telerik RadPanel Scroll bar

In questi giorni sono impazzito per cercare il modo per visualizzare la scrollbar orizzontale in una RadPanelBar (il controllo Telerik); ho cercato con google, ho pensato di estendere il controllo, di creare un custom control, etc… Alla fine, un mio collega, mi ha dato una semplicissima soluzione: Basta inserire nel nostro foglio di stile le seguenti righe:

.RadPanelBar .rpItem {
overflow: visible !important;
}

.RadPanelBar .rpLevel1 {
height: 100% !important;
overflow: auto !important;
}

E’ vero che le soluzioni semplici sono sempre le migliori…

404: The resource cannot be found – HttpRuntime

Sarà banale, ma son quelle piccole cose che fanno perdere un sacco di tempo.
Lo posto anche per ricordarmi quanto sono pirla a volte…
Dunque: tiro giù dal Subversion un vecchio sito funzionante per fare delle modifiche.
Lo installo su IIS 7, configuro il website e mi collego con IE.
Il risultato è il più classico dei 404:

Il file c’è, verifico i diritti sulla cartella (OK), sul file (OK). Provo altre pagine asp.net, nada. Le risorse statiche invece funzionano.
Googlo un po’, provo poco convinto qualche soluzione ma niente.
Alla fine vedo una parolina in un post… httpruntime….

VUOI VEDERE CHE HO DISABILITATO IL MODULO DI HTTP RUNTIME DALLA PIPELINE ASP.NET????

A futura memoria che il messaggio di 404 può essere collegato all’httpruntime:
ho impostato l’ <httpruntime enable=true> nel web.config e tutto è ovviamente tornato a funzionare.

Recuperare indirizzo IP con Asp.NET e C#

Ho trovato ben due modi per recuperare l’indirizzo IP dei visitatori attraverso Asp.NET e C#.
Uno è molto semplice e ricorda quello usato in PHP (anzi sono praticamente uguali).
L’altro è un pò più sofisticato.
Prima di tutto create una pagina aspx e aggiungete una Label per stampare l’indirizzo.
Poi mettiamo mano al code-behind della pagina.
Questo è il metodo semplice:

protected void Page_Load(object sender, EventArgs e)
{
IPAdress.Text = Request.ServerVariables["REMOTE_ADDR"];
}

Continua a leggere