System.net.httplistener على Windows 7 Ultimate X64 يقتصر على اتصالات متزامنة 1K

StackOverflow https://stackoverflow.com/questions/4145297

  •  30-09-2019
  •  | 
  •  

سؤال

لقد كنت أحاول إجراء بعض الاختبارات مع http.sys / httplistener على محطة العمل الخاصة بي ويبدو أن هناك بعض الحد الذي يمنع أكثر من 1000 اتصال متزامن. هل لدى أي شخص المزيد من المعلومات حول هذا؟ (كما يبدو 1K قليلاً لتنظيف لتكون صدفة).

لقد حاولت العثور على أي مؤشر ترابط / تكوين / سجل ، لكنني ظهرت فارغة.

شكرا مقدما.
GJ


يبدو أنني قفزت البندقية قليلاً.

يبدو أنني قد فاتني أن استخدام http.sys / httplistener pegingetContext ليس جيدًا جدًا للاتصالات المتزامنة لأن velingetcontxt الجديد لن يطلق النار إلا بعد إغلاق دفق الاستجابة من الطلب السابق.

لذلك هناك تراكم من 1000 طلب ، وفي هذه الحالة كان المتراكم يملأ.

على أي حال - إذا كان لدى أي شخص أي تعليقات (أو تصحيحات محتملة) لا تتردد في التوسع.

شكرًا
GJ

هل كانت مفيدة؟

المحلول

الطريقة التي قمت بها هي أن يكون لديك موضوع يستمع إلى HttpListener باستخدام الحظر GetContext() الطريقة ولكن بمجرد أن يتلقى طلبًا يمرره إلى مؤشر ترابط آخر عن طريق إجراء استدعاء غير متزامن باستخدام IAsyncResult نمط ويبدو أن هذا يعمل بشكل جيد.

    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);
        }
    }

نصائح أخرى

فيما يلي طريقة مبسطة لدعم الطلبات المتزامنة المتعددة مع HTTPlistener.

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

سيمكنك هذا الآن من تلقي 50 طلبًا متزامنًا. يجب أن أعترف ، لم أحاول أبدًا إنشاء 1000!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top