c# .net stream httplistener
https://www.dropbox.com/s/ao63d7din939new/StackOverFlowSlowServerBug.zip

c# - HttpListener: escribir en outputstream lento dependiendo del contenido?



.net (1)

Problema de dos solicitudes:

Cromo:

  • Primera solicitud = favicon
  • Segunda solicitud = imagen

Firefox:

  • Primera solicitud = imagen para la pestaña
  • Segunda solicitud = imagen

Más sobre esto:

http://forums.mozillazine.org/viewtopic.php?t=341179

https://bugzilla.mozilla.org/show_bug.cgi?id=583351

ES DECIR:

  • Solo parece hacer que la solicitud

Si envía las solicitudes a través de Fiddler, nunca obtendrá dos.

Problema de rendimiento:

En primer lugar, hay un problema con el temporizador en su aplicación de demostración. Se reinicia cada vez que se dispara el controlador de solicitudes asíncronas, lo que significa que el temporizador iniciado para la solicitud A se reiniciará cuando se reciba la solicitud B, posiblemente antes de que se complete la solicitud A, por lo que no obtendrá los valores correctos. Crea el cronómetro dentro de la devolución de llamada ContinueWith.

En segundo lugar, no puedo ver de todos modos que el "número mágico" realmente afectará el rendimiento (a menos que cause una excepción, supongo). La única forma en que puedo degradar el rendimiento es mediante la emisión de muchas solicitudes concurrentes y haciendo que el bloqueo de espera sea golpeado continuamente.

En resumen: no creo que haya un problema con la clase HttpListener

Se eliminó la vieja pregunta y se reescribió completamente porque trabajé en esto bastante para identificar el problema. Mi problema es que estoy escribiendo un CMS personalizado con un servidor personalizado, con muy alta velocidad / minuciosidad como objetivo, sin embargo, me doy cuenta de que algunos datos o patrones de datos causan desaceleraciones importantes (entre 0 y 55 respuestas ms hora). Realmente necesito a alguien mejor que yo para ayudarme con esto, ya que no tengo ni idea de lo que está pasando, sospecho que hay un error en .Net Framework, pero no tengo idea de dónde podría estar, el pequeño código .net de navegación lo que hice no sugirió que el flujo de salida haga nada específico de datos

Las cosas que he probado y estoy seguro no son el problema:

  • Tamaño del contenido (el contenido más grande es más rápido)
  • Tipo de contenido (diferencia entre los mismos tipos de contenido)
  • La mayor parte del código circundante (hizo un proyecto minimalista para reproducir el error, de pie alrededor de 15 líneas, encuentra el enlace en la parte inferior de la publicación, incluye datos para reproducirlo, ejecutarlo, probar con 2 URL, ver por ti mismo).
  • No es un problema con las páginas web / caché, etc., el problema se reproduce con una sola imagen y CTRL + F5 en Firefox, eliminar los últimos bytes de la imagen lo corrige el 100% del tiempo, volver a agregarlos provoca el problema nuevamente
  • No es un problema que exista fuera de outputstream (reemplazarlo con un flujo de memoria de destino no muestra el problema)

Cómo reproducir el problema:

  • Descargue y ejecute el proyecto
  • Use su navegador favorito y vaya a localhost: 8080 / magicnumber
  • reemplaza el número mágico en esa URL por lo que quieras, recibirás la imagen de vuelta menos esa cantidad de bytes

Mi resultado:

  • Constante 50ms más o menos con esa imagen
  • Obtener el número mágico hasta 1000 no afecta esto en absoluto
  • un poco más lejos (creo que alrededor de 1080 ish?) cae repentinamente a 0MS
  • No estoy seguro de lo que está pasando, pero parece que hay 2 solicitudes por solicitud al menos al usar CTRL + F5 en Firefox, en el caso correcto ambos son 0ms, en el caso de error, el primero permanece 0ms pero el otro se convierte en 50ms, estoy asumiendo que el primero es simplemente verificar si el caché de archivos está bien y todavía estoy respondiendo pero Firefox cierra la conexión o algo así?

Cualquier ayuda es muy apreciada, colocando todos mis representantes en Bounty allí, ya que realmente necesito saber si sigo este camino / obtengo más información para informar esto o si voy al nivel inferior y hago mi propia interoperabilidad http.sys (y, la mayoría de todo, si el error solo está en el lado .net o en el nivel inferior, ¡ir al nivel inferior no lo arreglará!)

El archivo de muestra es una matriz gziped, mi contenido está previamente almacenado en caché y precomprimido en db, por lo que es representativo de los datos que necesito enviar.

https://www.dropbox.com/s/ao63d7din939new/StackOverFlowSlowServerBug.zip

Editar: si tengo el violín abierto, la prueba problemática vuelve a 0ms, no estoy seguro de qué hacer con esto hasta ahora, esto significa que estoy recibiendo una desaceleración importante, al enviar algunos datos, que no está definido por el tipo de datos, pero los datos reales, y esto no sucede si tengo violín en el medio. ¡Estoy perdido!

Edición 2: Probado con otro navegador solo para estar seguro y, de hecho, está de vuelta en 0ms en IE, así que supongo que puede que no sea un error de HttpListener sino un error de Firefox, editaré mis preguntas y etiquetas si no uno sugiere lo contrario. Si este es el caso, ¿alguien sabe dónde debería estar buscando en el código de FF para entender el problema? (Definitivamente es un problema, incluso si están de su lado, ya que una vez más estoy comparando con 2 archivos, uno más grande que el otro, el mismo formato de archivo, el más grande siempre toma 0ms el más pequeño siempre 55ms!)