J'ai implémenté un écouteur HTTP asynchrone dans C#.HttpListener asynchrone a reçu chaque demande deux fois
J'ai suivi le tutoriel fourni here by Microsoft
et a trouvé un autre tutoriel que je bêtement pas et maintenant bookmarked ne peut pas trouver de nouveau. Ce qui veut dire que j'ai un code que je n'aurais pas écrit de cette façon moi-même mais les explications fournies avaient du sens alors j'ai suivi ça.
Maintenant, je suis confronté à deux problèmes:
D'abord, je dois redémarrer l'auditeur après chaque demande avec Listener.Stop(), puis appeler la méthode StartListening et encore et, deuxièmement, quand je fais cela, je reçois chaque demande deux fois. La requête n'est pas envoyée deux fois, mais je la reçois deux fois. Il n'est cependant pas reçu deux fois lorsque je mets en pause le fil que j'écoute pendant environ 2 secondes.
Je suis désolé si je suis assez vague dans mes explications, mais ma compréhension de mon problème est aussi, je n'ai aucune idée de ce qui le cause. Puisque la méthode de rappel est là où la plupart des choses se passent, je vais juste poster, s'il vous plaît dites-moi si vous avez besoin de plus de code. Toute aide sera volontiers appréciée, car je suis vraiment bloqué sur celui-ci.
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)
{
}
}
Sans savoir ce qui appelle ce rappel, comment WaitHandle listenForNextRequest est utilisé et quelle méthode ListenAsynchronously fait, il est un peu un jeu de devinettes . – spender
Désolé pour cela, j'ai ajouté le code – Daniel
, vous devez imprimer sur la console (ou se connecter au fichier, si vous préférez) quelques informations de débogage utiles et poster ici. Veuillez spécifier quel système d'exploitation vous utilisez pour exécuter ce code et sa version. De cette façon sera plus simple en essayant de vous aider ... Cordialement, Giacomo – gsscoder