Il semble que le HttpListener ne permet pas de changer le HttpServerQueueLengthProperty propriété directement. Et by default this property is set to 1000.
Mais vous pouvez essayer de le définir manuellement après HttpListener démarrer. Il est bidouille, car il utilise la propriété interne RequestQueueHandle de HttpListener, donc utiliser à vos risques et périls.
Hack:
using System;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Runtime.InteropServices;
namespace Network.Utils
{
public static class HttpApi
{
public unsafe static void SetRequestQueueLength(HttpListener listener, long len)
{
var listenerType = typeof (HttpListener);
var requestQueueHandleProperty = listenerType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance).First(p => p.Name == "RequestQueueHandle");
var requestQueueHandle = (CriticalHandle)requestQueueHandleProperty.GetValue(listener);
var result = HttpSetRequestQueueProperty(requestQueueHandle, HTTP_SERVER_PROPERTY.HttpServerQueueLengthProperty, new IntPtr((void*)&len), (uint)Marshal.SizeOf(len), 0, IntPtr.Zero);
if (result != 0)
{
throw new HttpListenerException((int) result);
}
}
internal enum HTTP_SERVER_PROPERTY
{
HttpServerAuthenticationProperty,
HttpServerLoggingProperty,
HttpServerQosProperty,
HttpServerTimeoutsProperty,
HttpServerQueueLengthProperty,
HttpServerStateProperty,
HttpServer503VerbosityProperty,
HttpServerBindingProperty,
HttpServerExtendedAuthenticationProperty,
HttpServerListenEndpointProperty,
HttpServerChannelBindProperty,
HttpServerProtectionLevelProperty,
}
[DllImport("httpapi.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true)]
internal static extern uint HttpSetRequestQueueProperty(
CriticalHandle requestQueueHandle,
HTTP_SERVER_PROPERTY serverProperty,
IntPtr pPropertyInfo,
uint propertyInfoLength,
uint reserved,
IntPtr pReserved);
}
}
Exemple d'utilisation:
using (var listener = new HttpListener())
{
listener.Prefixes.Add("http://*:8080/your/service/");
listener.Start();
Network.Utils.HttpApi.SetRequestQueueLength(listener, 5000);
// ...
}
Après démarrage de l'application, vous pouvez vérifier la longueur de la file d'attente en exécutant cette commande:
netsh http show servicestate
Vérifiez la propriété "Max demande" pour votre processus. Maintenant, il doit être égal à 5000.
Avez-vous essayé de définir la clé de registre 'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ ASP.NET \ 4.0.30319.0 \ MaxConcurrentRequestsPerCPU' quelque chose de plus grand? (http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx) ou l'un des les entrées de registre ici http://support.microsoft.com/kb/820129 –
Merci pour la réponse Chris. Je n'ai pas encore eu l'occasion d'essayer les paramètres, cependant, le blog suggère que la file d'attente du noyau http.sys est différente de ce que MaxConcurrentRequestsPerCPU affecte. J'ai regardé les paramètres de registre pour http.sys avant et aucune des descriptions ne dit qu'ils vont modifier la longueur de la file d'attente –