C# und ausführen von HttpListener im hintergrund

Ich erstellt einfache HttpListener lauscht auf port 9090 und je nach Anforderung die URL schreibt ein paar Infos zu der Konsole.

Aber ich bin stecken geblieben 🙁 ich dachte, von Multi-Threading, event-basiertes system, aber ich dind auch nicht schaffen, etwas zu tun.

Hier ist der code meiner Zuhörer, die ich ins Leben gerufen als eine separate Konsole app:

string urlTemplate = String.Format("/prefix/{0}/suffix", id);
string prefix = String.Format("http://localhost:9090/");

HttpListener listener = new HttpListener();
listener.Prefixes.Add(prefix);

listener.Start();

Console.WriteLine("Listening to {0}...", prefix);

while (true)
{
    HttpListenerContext context = listener.GetContext();
    HttpListenerRequest request = context.Request;

    //Response object
    HttpListenerResponse response = context.Response;

    //Construct response
    if (request.RawUrl.Contains(urlTemplate) && request.HttpMethod == "POST")
    {
         string requestBody;
         Stream iStream = request.InputStream;
         Encoding encoding = request.ContentEncoding;
         StreamReader reader = new StreamReader(iStream, encoding);
         requestBody = reader.ReadToEnd();

         Console.WriteLine("POST request on {0} with body = [{1}]", request.RawUrl, requestBody);

         response.StatusCode = (int)HttpStatusCode.OK;

         //Return a response
         using (Stream stream = response.OutputStream) { }
     }
     else
     {
         response.StatusCode = (int)HttpStatusCode.BadRequest;
         Console.WriteLine("Invalid HTTP request: [{0}] {1}", request.HttpMethod, request.Url);
         using (Stream stream = response.OutputStream) { }
     }
}

Beschloss ich, es als ein Werkzeug für unit-tests (vielleicht woanders). Also wenn der test beginnt, die ich brauche um den listener zu konfigurieren, führen Sie es, dann stellen Sie einige Anforderungen und erhalten die info (die Zuhörer schrieb früher für die Konsole), und am Ende des Tests stoppen Sie die Zuhörer.

Meine Grundidee war es, incapsulate dieser listener zu trennen-Klasse MyHttpListener die Methoden: StartListener(), StopListener().

Aber wenn ich rufe StartListener() mein test friert ein, weil der unendliche while-Schleife. Ich habe versucht, die Erstellung von separaten hintergrund-thread oder event-basierte system, aber mein Mangel an Erfahrung mit Ihnen, hindert mich, es zu tun. Ich habe schon viel Zeit damit verbracht, zu versuchen, die Lösung finden, aber umsonst.

Hoffe Ihr könnt mir helfen Suche die Lösung für diese triviale Aufgabe.

Vielen Dank im Voraus.

InformationsquelleAutor Dragon | 2012-02-23

Schreibe einen Kommentar