2009-02-04 24 views
17

¿Cuál es la forma más rápida de ejecutar un método en un sitio web ASP.NET?Algo más rápido que HttpHandlers?

El escenario es bastante simple: tengo un método que se debe ejecutar cuando se golpea una página web. Nada más está sucediendo en la página, el único resultado representado es un mensaje "hecho". Quiero que el procesamiento sea lo más rápido posible.

Cada golpe es único, por lo que el almacenamiento en caché no es una opción.

Mi plan es utilizar un HttpHandler y configurarlo en web.config (mypage.ashx) en lugar de una página regular .aspx. Esto debería reducir significativamente los gastos generales.

Así que mi pregunta es realmente: ¿hay una manera más rápida de lograr esto que usando HttpHandlers?

Respuesta

25

Dependiendo de lo que esté haciendo, no esperaría ver una gran mejora con solo usar un HttpHandler. Comenzaría simplemente escribiendo HttpHandler y viendo cómo funciona. Si necesita que sea más rápido, intente ver más de cerca las cosas que realmente está haciendo mientras procesa la solicitud y ver qué se puede optimizar. Por ejemplo, si está haciendo un registro en una base de datos, intente escribir en una base de datos local en lugar de hacerlo en una red. Si aún no es lo suficientemente rápido, entonces tal vez busque escribir algo de nivel inferior. Hasta ese momento, me quedaría con lo que sea más fácil para ti.

Como referencia, he escrito un servidor de anuncios en ASP.NET (usando HttpHandlers) que puede publicar un anuncio (incluida la orientación y el registro de la impresión en una base de datos local) en 0-15ms bajo carga. Pensé que estaba procesando bastante, pero ese es un tiempo de respuesta bastante bueno en mi humilde opinión.


Update después de varios meses:

Si se quitan todos los HttpModules que se incluyen por defecto, esto eliminará una buena cantidad de gastos generales. Por defecto, los siguientes HttpModules se incluyen en cada sitio a través del archivo web.config a nivel de máquina:

  • OutputCache
  • Sesión (para el estado de sesión)
  • WindowsAuthentication
  • FormsAuthentication
  • PassportAuthentication
  • RoleManager
  • UrlAuthorization
  • FileAuthorization
  • AnonymousIdentification
  • Perfil
  • ManejadorError
  • ServiceModel

Como he dicho anteriormente, mi servidor de anuncios no utiliza ninguno de estos, por lo que acabamos de hacer esto en que la aplicación de web.config:

<httpModules> 
    <clear /> 
</httpModules> 

Si necesita algunos de ellos, pero no todos, puede quitar los que no es necesario:

<httpModules> 
    <remove name="PassportAuthentication" /> 
    <remove name="Session" /> 
</httpModules> 

ASP.NET MVC Nota: ASP.NET MVC requiere el módulo de estado de sesión a menos que haga algo específico para solucionarlo. Consulte esta pregunta para obtener más información: How can I disable session state in ASP.NET MVC?

Actualización para IIS7: Desafortunadamente, las cosas no son tan simples en IIS7. Aquí está how to clear HTTP Modules in IIS7

+0

Estás muerto: realizaré algunos inicios de sesión en una base de datos. Y planeé crear pequeños archivos de texto en lugar de ir a la base de datos. Los archivos se procesarán más tarde. Pero en función de su experiencia y tiempo de respuesta impresionante que logró, seguiré adelante con un simple acceso HttpHandler y db. –

+1

Lo que hemos hecho es poner una instancia de SQL Express en los servidores web en los que se escribe, y luego hay un trabajo que extrae todos los datos de las instancias del servidor web en nuestro servidor SQL principal. –

+0

Impresionante, gracias por la actualización. Muy útil. –

1

No estoy seguro de cuál es su situación exacta, pero si toda su página está procesando algunos datos, realmente no necesita una página aspx o un controlador http en absoluto. Puede escribir un servicio web ASMX o un servicio WCF para hacer lo que necesita y es probable que esto suponga menos gastos generales. El servicio WCF ni siquiera tiene que estar alojado en ASP.NET. Puede alojarlo desde un servicio de Windows o una aplicación de consola, y llamarlo en proceso utilizando conductos con nombre. Esto probablemente reduciría la sobrecarga para llamar al código de procesamiento de datos de manera significativa.

+0

Buena llamada, no pasó por mi mente que esto podría ser un proceso interno. Supongo que necesitamos saber más sobre lo que está haciendo. –

+0

Voy a hacer algunas cosas de AJAX/javascript, donde tengo que registrar el evento del lado del cliente en el servidor. No estoy muy seguro de cómo ejecutaría el método de servicio WCF desde js, pero haré algo de google en esto, definitivamente. :) Por ahora HttpHandlers es probablemente la mejor solución para mí. Gracias por sus respuestas. –

+0

Llamar a un servicio WCF desde js es realmente más fácil de lo que piensas, especialmente si no necesitas lidiar con un valor de retorno (solo dispara y olvida). Consulte http://msdn.microsoft.com/en-us/library/bb514961.aspx para obtener más información. – davogones

0

Si realmente tiene que usar asp.net, también puede enganchar en el paso AuthorizeRequest e interceptar la solicitud desde allí, realizar su procesamiento y escribir su respuesta Done directamente.

Cuestiones relacionadas