Asynkron HttpListener

I förra artikeln introducerade jag den nya klassen HttpListener i .NET Framework 2.0. Här kommer en liten uppdatering som visar hur vi kan låta vårt objekt agera asynkront istället för som tidigare synkront. Jag använder mig av Visual C# 2005 Express vilket ger mig lite roliga funktioner såsom refactoring vilket jag tänkte att vi skulle börja använda.

Fortsätt på koden från den förra artikeln och markera följande kodstycke:

HttpListenerContext context = ourListener.GetContext();

HttpListenerResponse response = context.Response;

string responseString = "The time is currently " + DateTime.Now.ToString() + "";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
response.ContentLength64 = buffer.Length;

System.IO.Stream output = response.OutputStream;
output.Write(buffer, 0, buffer.Length);
response.Close();

Högerklicka på den markerade texten och välj Refactor | Extract Method. Välj ett beskrivande metodnamn, jag har valt HandleResponse vilket beskriver vad som sker, eller hur. Tryck OK och observera vad som händer. Koden som tidigare fanns inne i den statiska Main metoden har nu brutits ut och ersatts med ett anrop till metoden HandleResponse, mycket trevligt. Dock så räcker inte den här förändringen för att vårt objekt ska bli asynkront, vi måste göra lite andra förändringar också.

Istället för att anropa den synkrona GetContext() metoden ska vi nu istället anropa BeginGetContext() och skicka in en så kallad callback-metod som ska anropas när vårt objekt tar emot anrop över HTTP. Uppdatera raden som ser ut så här:

HandleResponse();

Till att se ut som följande (Den sista parametern som jag valt att sätta till null, behöver vi inte bry oss om för närvarande):

ourListener.BeginGetContext(HandleResponse, null);

Vi måste också uppdatera HandleResponse signaturen att ta emot en parameter för att bli en korrekt implementerad Callback-metod, därför lägger vi till parametern result av datatypen IAsyncResult. Det objektet kan vi sedan använda när vi anropar EndGetContext() för att få ut korrekt resultat.

private static void HandleResponse(IAsyncResult result)
{
   HttpListenerContext context = ourListener.EndGetContext(result);
   ...

Vi lägger också till sist i HandleResponse(...) metoden följande anrop för att återigen starta den asynkrona lyssnaren:

   ourListener.BeginGetContext(HandleResponse, null);
}

Nu kan vi köra applikationen igen, observera den här gången att vi kommer direkt att skriva ut på Console-fönstret texten "Listening is done...", men det betyder den här gången att lyssnaren är startad och kommer att lyssna på anrop till det prefix vi angett ända tills vi trycker på någon knapp i Console-fönstret, alternativt avslutar applikationen på annat sätt. Prova genom att surfa till vårt prefix ett antal gånger för att se att vi får nya resultat kontinuerligt.

Den här artikeln har fortsatt på den tidigare introduktionen till HttpListener, är det här bra information och vill du se fler liknande artikler, kommentera gärna artikeln och du har också möjlighet att ge en "rating".