2010-11-10 13 views
6

İş istasyonumda HTTP.sys/HttpListener ile bazı testler yapmaya çalışıyorum ve daha fazla önleyen bir miktar limit var gibi görünüyor. 1000 eşzamanlı bağlantı. Bunun hakkında daha fazla bilgisi var mı? (1k bir tesadüf olmak için biraz temiz gibi görünüyor).System.Net.HttpListener Windows 7 Ultimate x64 için 1k Eşzamanlı Bağlantılar

Herhangi bir iş parçacığı/config/kayıt defteri ayarı bulmayı denedim ama boşaldım.

Şimdiden teşekkürler. Ben silahı biraz atladı gibi
GJ


görünüyor.

http.sys/HttpListener BeginGetContext kullanarak yeni BeginGetContext'in yalnızca önceki istekte bulunan yanıt akışının kapatılmasından sonra tetikleneceğinden eşzamanlı bağlantılar için çok iyi bir şey olmadığını fark ettim.

Yani 1000 istek yığılma var, ve bu durumda birikim doldu. Her neyse - herhangi bir yorum varsa (veya muhtemel düzeltmeler varsa) genişlemekte özgürsünüz.

Teşekkür
GJ İşte

cevap

5

Ben engelleme GetContext() yöntemi kullanılarak HttpListener dinler ama en kısa zamanda bir istek aldığında olarak IAsyncResult desen kullanarak bir zaman uyumsuz çağırma işlemi yaparak başka bir evreye kapalı geçen bir iplik sahip olmaktır yaptık yolu ve Bu iyi çalışıyor gibi görünüyor.

private void Run() 
    { 
     while (true) 
     { 
      if (this._disposed || this._shouldTerminate) return; 

      if (this._listener.IsListening) 
      { 
       try 
       { 
        HttpListenerContext context = this._listener.GetContext(); 

        //Hand it off to be processed asynchronously 
        this._delegate.BeginInvoke(context, new AsyncCallback(this.EndRequest), null); 
       } 
       catch (Exception ex) 
       { 
        this.LogErrors(ex); 
       } 
      } 
     } 
    } 

    private delegate HttpServerContext HandleRequestDelegate(HttpListenerContext context); 

    private HttpServerContext HandleRequest(HttpListenerContext context) 
    { 
     IHttpListenerHandler handler; 
     HttpServerContext serverContext = new HttpServerContext(this, context); 
     try 
     { 
      bool skipHandling = this.ApplyPreRequestModules(serverContext); 
      if (!skipHandling) 
      { 
       handler = this._handlers.GetHandler(serverContext); 
       handler.ProcessRequest(serverContext); 
      } 
     } 
     catch (NoHandlerException noHandlerEx) 
     { 
      this.LogErrors(noHandlerEx); 
      context.Response.StatusCode = (int)HttpStatusCode.MethodNotAllowed; 
     } 
     catch (HttpServerException serverEx) 
     { 
      this.LogErrors(serverEx); 
      context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; 
     } 

     return serverContext; 
    } 

    private void EndRequest(IAsyncResult result) 
    { 
     try 
     { 
      HttpServerContext context = this._delegate.EndInvoke(result); 
      this.ApplyPreResponseModules(context); 
      context.Response.Close(); 
     } 
     catch (Exception ex) 
     { 
      this.LogErrors(ex); 
     } 
    } 
+0

Şerefe Rob - bu beni çizginin üzerinden geçirdi! – CameraSchoolDropout

0

HttpListener ile birden eşzamanlı isteklerini destekleyen bir basit bir yaklaşımdır.

 for (int i = 0; i < 50; i++) { 
      _listener.BeginGetContext(GetContextCallback, null); 
     } 

Bu, şimdi 50 eşzamanlı istek almanızı sağlayacaktır. Kabul etmeliydim, 1000'i hiç denemedim!

+0

Teşekkürler Darrel - bu işe yarıyor ama maalesef karşılaştığım problemlere uymuyor. – CameraSchoolDropout