Ho implementato un listener HTTP asincrono in C#.HttpListener asincrono ogni richiesta viene ricevuta due volte
ho seguito il tutorial fornito here by Microsoft
e ha trovato un altro tutorial che non ho stupidamente segnalibro e ora non riesce a trovare di nuovo. Significa che ho un codice che non avrei scritto in quel modo da solo, ma le spiegazioni fornite avevano senso, quindi l'ho seguito.
Ora sto affrontando due problemi:
In primo luogo, devo riavviare l'ascoltatore dopo ogni richiesta con Listener.Stop() e poi chiamare e di nuovo e secondo il metodo StartListening, quando faccio questo, ricevo ogni richiesta due volte. La richiesta viene inviata due volte, ma la ricevo due volte. Tuttavia non viene ricevuto due volte quando metto in pausa la discussione su cui sto ascoltando per circa 2 secondi.
Mi dispiace se sono abbastanza vago nelle mie spiegazioni, ma così è la mia comprensione del mio problema, non ho idea di cosa lo stia causando. Dato che il metodo di callback è dove succede la maggior parte delle cose, lo posterò, per favore dimmi se hai bisogno di altro codice. Qualsiasi aiuto sarà apprezzato, poiché sono davvero bloccato su questo.
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)
{
}
}
Senza sapere che cosa invoca questo callback, come WaitHandle listenForNextRequest viene utilizzata e quale metodo fa ListenAsynchronously, è un po 'un gioco di indovinare . – spender
Ci scusiamo per questo, ho aggiunto il codice – Daniel
che dovresti stampare su console (o accedere al file, se preferisci) alcune utili informazioni di debug e postare qui. Si prega di specificare quale sistema operativo si utilizza per eseguire questo codice e la sua versione. In questo modo sarà più semplice cercare di aiutarti ... Cordiali saluti, Giacomo – gsscoder