Hmm. Lad mal das Projekt hoch bitte
Als ich es damals mal verwendet hatte, hab ich für den Listener einen extra Thread instanziert.
achja mit der Methode Abort() kannst du ihn jederzeit beenden unabhängig vom zustand.
Edit: Du wirst wahrscheinlich die synchrone Methode GetContext() verwendet haben? Somit ist klar das die Anwendung blockt. WEnn du die asynchronen Methoden BeginGetContext() und EndGetContext() nimmst, dann wird für jede HTTP Verbindung ein eigener Ausführungsthread gestartet.
Ich hab es damals so gemacht, das ich den HttpListener schon in einen extrigen Thread gestartet habe und zusätzlic für die Verbindungen die asynchronen Methoden verwendet hab. müsste aber auch gehen wenn du den listener im selben thread wie die main anwendung startest( ist ja bei reinen servern so, bei mir war ja damals der listener nur zusatz bonus einer bestehen anwendung) und die asynchronen methoden verwendest.
Code:
public static void NonblockingListener(string [] prefixes)
{
HttpListener listener = new HttpListener();
foreach (string s in prefixes)
{
listener.Prefixes.Add(s);
}
listener.Start();
IAsyncResult result = listener.BeginGetContext(new AsyncCallback(ListenerCallback),listener);
// Applications can do some work here while waiting for the
// request. If no work can be done until you have processed a request,
// use a wait handle to prevent this thread from terminating
// while the asynchronous operation completes.
Console.WriteLine("Waiting for request to be processed asyncronously.");
result.AsyncWaitHandle.WaitOne();
Console.WriteLine("Request processed asyncronously.");
listener.Close();
}
Code:
public static void ListenerCallback(IAsyncResult result)
{
HttpListener listener = (HttpListener) result.AsyncState;
// Call EndGetContext to complete the asynchronous operation.
HttpListenerContext context = listener.EndGetContext(result);
HttpListenerRequest request = context.Request;
// Obtain a response object.
HttpListenerResponse response = context.Response;
// Construct a response.
string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
// Get a response stream and write the response to it.
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer,0,buffer.Length);
// You must close the output stream.
output.Close();
}
Lesezeichen