System.net.httplistener على Windows 7 Ultimate X64 يقتصر على اتصالات متزامنة 1K
-
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!