我正在使用此代码来实现Http Server:
public Server()
{
_httpListener = new HttpListener();
_httpListener.Prefixes.Add(Server.UriAddress);
StartServer();
}
public void StartServer()
{
_httpListener.Start();
while (_httpListener.IsListening)
ProcessRequest();
}
void ProcessRequest()
{
var result = _httpListener.BeginGetContext(ListenerCallback, _httpListener);
result.AsyncWaitHandle.WaitOne();
}
void ListenerCallback(IAsyncResult result)
{
HttpListenerContext context = _httpListener.EndGetContext(result);
HttpListenerRequest request = context.Request;
string url = request.RawUrl;
url = url.Substring(1, url.Length - 1);
HttpListenerResponse response = context.Response;
string responseString = url;
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer, 0, buffer.Length);
output.Close();
}
我有一个问题,如果我在浏览器中写这个(这是一个例子,它发生在每次通话):
http://localhost:8888/Hello%20World
ListenerCallback
方法被调用两次,任何想法如何修复它?
答案 0 :(得分:5)
答案已被接受,但我认为其他人随后可能仍然有用。
默认情况下,大多数给定URL的浏览器至少会进行两次调用。一次调用请求URL,另一次调用favicon.ico。
因此应在ListenerCallback中进行检查,如
HttpListenerContext context = _httpListener.EndGetContext(result);
HttpListenerRequest request = context.Request;
string url = request.RawUrl;
url = url.Substring(1);
if (url == "favicon.ico")
{
return;
}
//normal request handling code
我希望这有助于某人。
答案 1 :(得分:2)
如果您的网站需要多次调用服务器,则会多次调用它。当您在页面上有图片或其他任何内容时会发生这种情况
尝试调用同步方法_httpListener.GetContext()
或将调用与lock
或Mutex
同步。
答案 2 :(得分:0)
我不确定,但我认为我发现您的代码可能存在问题。 您正在混合两种异步处理模式 您通过等待异步结果中的waithandle释放主线程。 但我认为只有你可以调用endgetcontext的信号,而不是另一个线程可以使用监听器。 如果您正在使用回调模式,则应使用asyncresult中提供的等待句柄以外的等待句柄释放主线程