Я реализовал асинхронный http-слушатель в c #.
Я следовал учебнику, предоставленному здесь Microsoft
, и нашел другой учебник, который я тупо не добавил в закладки и теперь не могу найти снова.Это означает, что у меня есть некоторый код, который я бы сам не написал таким образом, но предоставленные объяснения имели смысл, поэтому я следовал этому.
Теперь я столкнулся с двумя проблемами:
Во-первых, я долженперезапускать слушатель после каждого запроса с помощью Listener.Stop (), а затем вызывать метод StartListening, а затем снова и снова, когда я делаю это, я получаю каждый запрос дважды.Запрос net net отправляется дважды, но я получаю его дважды.Однако он не получает дважды, когда я приостанавливаю поток, который я слушаю, примерно на 2 секунды.
Прошу прощения, если я довольно расплывчат в своих объяснениях, но так же, как и мое понимание моей проблемы, я понятия не имею, что ее вызывает.Так как метод обратного вызова - это то, где происходит большинство вещей, я просто опубликую его, пожалуйста, скажите мне, если вам нужно больше кода.Любая помощь будет с благодарностью, так как я действительно застрял на этом.
public void ListenAsynchronously()
{
if (listener.Prefixes.Count == 0) foreach (string s in prefixes) listener.Prefixes.Add(s);
try
{
listener.Start();
}
catch (Exception e)
{
Logging.logException(e);
}
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(Listen));
}
private void Listen(object state)
{
while (listener.IsListening)
{
listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
listenForNextRequest.WaitOne();
}
}
private void ListenerCallback(IAsyncResult ar)
{
HttpListener httplistener = ar.AsyncState as System.Net.HttpListener;
System.Net.HttpListenerContext context = null;
int requestNumber = System.Threading.Interlocked.Increment(ref requestCounter);
if (httplistener == null) return;
try
{
context = httplistener.EndGetContext(ar);
}
catch(Exception ex)
{
return;
}
finally
{
listenForNextRequest.Set();
}
if (context == null) return;
System.Net.HttpListenerRequest request = context.Request;
if (request.HasEntityBody)
{
using (System.IO.StreamReader sr = new System.IO.StreamReader(request.InputStream, request.ContentEncoding))
{
string requestData = sr.ReadToEnd();
//Stuff I do with the request happens here
}
}
try
{
using (System.Net.HttpListenerResponse response = context.Response)
{
//response stuff happens here
}
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
response.ContentLength64 = buffer.LongLength;
response.OutputStream.Write(buffer, 0, buffer.Length);
response.Close();
StopListening();
//If I dont set the thread to sleep here, I receive the double requests
System.Threading.Thread.Sleep(2500);
ListenAsynchronously();
}
}
catch (Exception e)
{
}
}