c# - Asignaciones de archivos IIS7-.asax,.ashx,.asap
asp.net iis-7 (4)
Algunos puntos:
- Los archivos asmx no son lo mismo que los archivos ascx. Los usas para servicios web (jabón) en lugar de controles web.
- los archivos ashx no tienen que estar registrados. Básicamente son un aspx más simple , para cuando no necesitas todo el ciclo de vida de la página. Un uso común es para recuperar imágenes dinámicas de una base de datos.
- Si un hacker intentó solicitar uno de estos archivos, ¿qué le gustaría que sucediera? Ciertamente no querrá que IIS lo trate como un archivo de texto y envíe la fuente de su aplicación al navegador.
- El hecho de que no espere solicitudes de un recurso por parte del navegador no significa que no desee que el motor asp.net maneje ese recurso. Estas extensiones son también la forma en que ASP.Net recoge los archivos para compilar para los sitios modelo del sitio web.
IIS nos permite también configurar asignaciones de archivos Asp.Net. Por lo tanto, además de aspx, IIS también invoca Asp.Net runtime, cuando las solicitudes tienen las siguientes extensiones de archivo:
a) La extensión .ascx -> .asmx se usa para solicitar controles de usuario.
- Dado que no se puede acceder directamente a los controles del usuario, ¿cómo y por qué alguien enviaría una solicitud al control del usuario?
b) .ashx -> esta extensión se usa para manejadores HTTP.
• ¿Pero por qué querría solicitar una página .ashx directamente en lugar de registrar este controlador dentro del archivo de configuración y permitir que se llame cuando se solicitan archivos con ciertas extensiones (no ashx)?
• Además, dado que puede haber varios manejadores de Http registrados, ¿cómo sabrá Asp.Net qué controlador invocar si todos utilizan la extensión de ashx?
• ¿Qué contiene el archivo ashx solicitado? Tal vez una definición de una clase de controlador Http?
• Sé cómo registramos controladores Http para invocar cuando se solicitan páginas que no sean ashx, pero ¿cómo registramos el controlador Http para la página ashx?
c) .asax -> Esta extensión se usa para solicitar un archivo de aplicación global
• ¿Por qué querríamos llamar a Global.asax directamente?
• Supongo que cuando se realiza una solicitud para Global.asax, se crea un objeto derivado de la clase HTtpApplication, excepto que esta vez no se procesa la página web.
gracias
P: Además de que Asp.Net puede solicitar la compilación de global.asax, ¿hay alguna otra razón por la que elegiría solicitar el archivo con la extensión .asax directamente?
• los archivos ashx no tienen que estar registrados. Básicamente son un aspx más simple, para cuando no necesitas todo el ciclo de vida de la página. Un uso común es para recuperar imágenes dinámicas de una base de datos.
Entonces, si escribo un controlador Http, debería ponerlo en un archivo con la extensión .ashx y Asp.Net construirá un objeto HttpHandler de manera similar a cómo construye una instancia de página del archivo .aspx.
• Si un hacker intentó solicitar uno de estos archivos, ¿qué le gustaría que ocurriera? Ciertamente no querrá que IIS lo trate como un archivo de texto y envíe la fuente de su aplicación al navegador.
Asp.Net podría hacer lo mismo con los tipos de archivo .cs, .csproj, .config, .resx, .licx, .webinfo. A saber, registra estos tipos de archivos con IIS para que impida explícitamente a los usuarios acceder a estos archivos
• El hecho de que no espere solicitudes de un recurso por parte del navegador no significa que no desee que el motor asp.net maneje ese recurso. Estas extensiones son también la forma en que ASP.Net recoge los archivos para compilar para los sitios modelo del sitio web.
Pero entonces, ¿por qué Asp.Net también permite que se soliciten directamente los archivos .cs, .csproj, .config, .resx, .licx, .webinfo?
a) yc) - por lo que yo sé, estos no están expuestos a procesar solicitudes externas
mi libro afirma que los dos están mapeados en IIS
Aprecio tu ayuda
EDITAR:
b) La extensión .ashx se define en un archivo de configuración, simplemente no es el web.config, está en el machine.config
<add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" />
http://msdn.microsoft.com/en-us/library/bya7fh0a.aspxPor qué usar .ashx: La diferencia es que la clase .NET que maneja un .ashx lee la directiva de página en el archivo .ashx para asignar la solicitud a una clase especificada en esa directiva. Esto le ahorra tener que colocar una ruta explícita en el archivo web.config para cada controlador que tenga, lo que podría resultar en un muy largo web.config.
Pensé que la clase de controlador de Http se definió dentro del archivo .ashx, pero en su lugar el archivo con la extensión .ashx solo contiene la directiva de la página.
Ya que no estoy 100% seguro de que entiendo esto correctamente: supongamos que tenemos diez manejadores de Http que queremos invocar haciendo una solicitud a IIS7. Supongo que para cada controlador de Http habrá archivo .ashx específico -> así si se realiza una solicitud para FirstHandler.asxh, ¿se invocará el controlador especificado dentro de ese archivo?
AÚN OTRA EDICIÓN:
Debo confesar que todavía estoy un poco inseguro sobre la extensión de ashx.
Me doy cuenta de que al usarlo podemos, por ejemplo, crear la página ''hey.ashx'', donde la directiva de la Página indicará qué clase (controlador Http) invocar cuando se solicite ''hey.ashx'' - por lo tanto, no es necesario registrar el controlador Http en web.config.
Pero si usa los manejadores Http de esa manera, solo se invocarán cuando se realicen solicitudes para archivos con la extensión .ashx. Por lo tanto, si quiero que el manejador Http se invoque para archivos con otras extensiones, como .sourceC, entonces aún tendré que registrar el controlador Http en web.config ?!
a) yc) - por lo que yo sé, estos no están expuestos a procesar solicitudes externas
b) de forma predeterminada, buscará un archivo .ashx con la ruta / nombre solicitado. Esto hace que sea realmente fácil agregar un controlador a un sitio web, sin necesidad de configuración.
Actualización: en una también mencionaste asmx. Mi opinión es que el libro está explicando algunas características relacionadas con ajax, con algunos comentarios sobre:
- Asp.net no permite hacer solicitudes apuntadas a .ascx.
- Puede realizar una solicitud a un servicio web (.asmx) para obtener la información.
- Hay algunas características integradas para ayudarte con lo anterior.
a) .ascx no se puede acceder directamente porque el controlador predeterminado es la clase System.Web.HttpForbiddenHandler
<add path="*.ascx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
Los archivos .asmx pueden invocarse directamente, son webmethods (aunque generalmente debe realizar una solicitud POST, a menos que especifique que permita GET en la web.config
b) La extensión .ashx se define en un archivo de configuración, simplemente no es el web.config, está en el machine.config
<add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" />
http://msdn.microsoft.com/en-us/library/bya7fh0a.aspx
Por qué usar .ashx: La diferencia es que la clase .NET que maneja un .ashx lee la directiva de página en el archivo .ashx para asignar la solicitud a una clase especificada en esa directiva. Esto le ahorra tener que colocar una ruta explícita en el archivo web.config para cada controlador que tenga, lo que podría resultar en un muy largo web.config.
-
c) Global.asax: no uso gloabl.asax, prefiero usar la muy elegante solución HttpModule, pero probablemente esté configurada para sitios heredados que tienen archivos global.asax.
Para aclarar definitivamente cualquier confusión que pueda tener sobre lo que asp.net hace con estas solicitudes, consulte la web.config en:
%systemroot%/Microsoft.NET/Framework/v2.0.50727/CONFIG
Como puede ver (publicado a continuación), asp.net excluye casi todos los archivos que no está seguro de si estaban recibiendo un tratamiento especial. Observe que hay * .cs, * .acsx, * .asax.
<add path="*.asax" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.ascx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.master" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.skin" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.browser" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.sitemap" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.dll.config" verb="GET,HEAD" type="System.Web.StaticFileHandler" validate="True"/>
<add path="*.exe.config" verb="GET,HEAD" type="System.Web.StaticFileHandler" validate="True"/>
<add path="*.config" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.cs" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.csproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.vb" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.vbproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.webinfo" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.licx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.resx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.resources" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.mdb" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.vjsproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.java" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.jsl" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.ldb" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.ad" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.dd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.ldd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.sd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.cd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.adprototype" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.lddprototype" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.sdm" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.sdmDocument" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.mdf" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.ldf" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.exclude" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
<add path="*.refresh" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
Además, tenga en cuenta que IIS podría no estar configurado para asignar algunas solicitudes (tipos MIME) a la canalización de ASP.NET.