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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer der responder-Variante (es scheint, dass er seinen post gelöscht) sah gut aus, aber es hat nicht funktioniert für mich. Ich habe versucht, Dinge zu reparieren, um es begann, aber am Ende, dass die Variante mir eine Idee, wie das problem zu lösen - mit multithreading und events 🙂
Hier ist, was ich jetzt habe und es funktioniert:
...
...
Damit erhalten Sie ausführliche Antworten von HttpListener im Haupt-thread, ich verwende die folgenden:
Leider habe ich die folgende Ausnahme, die ich weiß nicht, wie zu handhaben:
InformationsquelleAutor Dragon