He implementado un oyente http asincrónico en C#.HttpListener asíncrono tiene cada solicitud se recibe dos veces
he seguido el tutorial proporciona here by Microsoft
y encontró otro tutorial que me estúpidamente no bookmarked y ahora no puede encontrar de nuevo. Lo que significa que tengo un código que yo no habría escrito de esa manera pero las explicaciones proporcionadas tenían sentido, así que seguí eso.
Ahora estoy frente a dos problemas:
En primer lugar, tengo que reiniciar el oyente después de cada petición con Listener.Stop() y luego llamar al método StartListening y otra vez y en segundo lugar, cuando hago esto, recibo cada solicitud dos veces. La solicitud no se envía netamente dos veces, pero la recibo dos veces. Sin embargo, no se recibe dos veces cuando pongo en pausa el hilo que estoy escuchando durante unos 2 segundos.
Lo siento si soy bastante vago en mis explicaciones, pero también lo es mi comprensión de mi problema, no tengo idea de qué lo está causando. Dado que el método de devolución de llamada es donde ocurre la mayoría de las cosas, solo lo publicaré, por favor dígame si necesita más código. Cualquier ayuda será gratamente apreciada, ya que estoy realmente atrapado en esta.
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)
{
}
}
Sin saber lo que invoca esta devolución de llamada, cómo se utiliza WaitHandle listenForNextRequest y qué método hace ListenAsynchronously, que es un poco de un juego de adivinanzas . – spender
Disculpe por eso, agregué el código – Daniel
que debe imprimir en la consola (o registrar en el archivo, si lo prefiere) alguna información de depuración útil y publicar aquí. Especifique qué sistema operativo usa para ejecutar este código y su versión. De esta forma será más sencillo intentar ayudarte ... Saludos, Giacomo – gsscoder