【发布时间】:2012-02-23 15:17:28
【问题描述】:
我创建了简单的HttpListener,它侦听端口 9090,并根据请求的 URL 将一些信息写入控制台。
但我被困住了:(我想到了多线程、基于事件的系统,但我没能用它做任何事情。
这是我作为单独的控制台应用程序启动的侦听器的代码:
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) { }
}
}
我决定将它用作单元测试的实用程序(也许在其他地方)。因此,当测试开始时,我需要配置侦听器,运行它,然后发出一些请求并接收信息(侦听器之前向控制台写入的信息),并在测试结束时停止侦听器。
我的主要想法是将这个侦听器封装到单独的类 MyHttpListener 中,该类具有以下方法:StartListener()、StopListener()。
但是当我调用StartListener() 时,我的测试因为无限的while 循环而冻结。我试图创建单独的后台线程或基于事件的系统,但我缺乏使用它们的经验,阻止了我这样做。我已经花了很多时间试图找到解决方案,但都是徒劳的。
希望你能帮我找到解决这种琐碎任务的方法。
提前致谢。
【问题讨论】:
标签: c# multithreading events httplistener