funciona evento dropdownlist c# asp.net-mvc httpmodule

c# - funciona - dropdownlist evento selectedindexchanged



¿Por qué no se activa mi controlador de eventos HttpModule EndRequest anidado? (1)

Tengo un comportamiento extraño cuando intento modificar mis encabezados con un controlador de eventos EndRequest en un HttpModule anidado en MVC 5.2.2 y .NET 4.6.2. Si no EndRequest en mi HttpModule nivel superior, parece que el controlador de eventos en el HttpModule anidado nunca se HttpModule , aunque sé que se llamó a Init en el HttpModule anidado.

Mi pregunta es, ¿qué está ocurriendo en mi código a continuación para evitar que aparezca el encabezado "TestNested" en los encabezados de respuesta, a menos que incluya el código comentado que agrega un controlador de eventos EndRequest que no hace nada?

Registrar dinámicamente mi HttpModule nivel superior

[assembly: PreApplicationStartMethod(typeof(PreApplicationStartClass), "Start")] namespace MyNamespace { public class PreApplicationStartClass { public static void Start() { DynamicModuleUtility.RegisterModule(typeof(TopHttpModule)); } } }

Llame a Init en todos mis otros HttpModules desde un solo módulo de nivel superior

namespace MyNamespace { public class TopHttpModule: IHttpModule { private readonly Lazy<IEnumerable<IHttpModule>> _modules = new Lazy<IEnumerable<IHttpModule>>(RetrieveModules); private static IEnumerable<IHttpModule> RetrieveModules() { return DependencyResolver.Current.GetServices<IHttpModule>(); } public void Init(HttpApplication context) { var modules = _modules.Value; foreach (var module in modules .Where(module => module.GetType() != typeof(TopHttpModule))) { module.Init(context); } context.BeginRequest += (sender, e) => { var app = sender as HttpApplication; if (app != null) { //This shows that NestedHttpModule was found app.Context.Response.Headers.Add( "TestModules", string.Join(",", modules.Select(_ => _.GetType().ToString()))); } }; //Add this and the NestedHttpModule EndRequest handler works //context.EndRequest += (sender, e) => //{ // //Do Nothing //}; } public void Dispose() { var modules = _modules.Value; foreach (var disposable in modules .Where(disposable => disposable.GetType() != typeof(TopHttpModule))) { disposable.Dispose(); } } } }

Modificar alguna información de encabezado en un controlador de eventos EndRequest

namespace MyNamespace { public class NestedHttpModule: IHttpModule { public void Init(HttpApplication context) { //This gets called whether or not the TopHttpModule modifies context.EndRequest MvcHandler.DisableMvcResponseHeader = true; context.EndRequest += Application_EndRequest; } public void Application_EndRequest(object sender, EventArgs e) { var app = sender as HttpApplication; if (app != null && app.Context != null) { //This doesn''t appear to be called unless TopHttpModule modifies context.EndRequest app.Context.Response.Headers.Add("TestNested", "Found"); } } public void Dispose() { //Do Nothing } } }


También quería modificar mis encabezados, pero necesitaba esconderme lo más posible. Es lo mismo para Agregar o Eliminar o para ambos, solo son encabezados.

1) Puede configurar MvcHandler.DisableMvcResponseHeader = true; en el global.asax

protected void Application_Start() { MvcHandler.DisableMvcResponseHeader = true; } and protected void Application_PreSendRequestHeaders() { Response.Headers.Remove("Server"); Response.Headers.Remove("X-AspNet-Version"); }

2) Realmente no debe usar el módulo diff para casi el mismo trabajo, en su lugar, cree un HeadersModule que solo maneje la modificación del encabezado y use PreSendRequestHeaders para agregar o eliminar los encabezados que desee. Siempre puede inyectar algún servicio con la lista de encabezados para agregar o eliminar.

public class HeadersModule : IHttpModule { public void Init(HttpApplication context) { context.PreSendRequestHeaders += OnPreSendRequestHeaders; } public void Dispose() { } void OnPreSendRequestHeaders(object sender, EventArgs e) { var r = sender as HttpApplication; r.Response.Headers.Remove("Server"); r.Response.Headers.Remove("X-AspNetMvc-Version"); r.Response.Headers.Remove("X-AspNet-Version"); r.Response.Headers.Remove("X-Powered-By"); } }

3) Para estar más seguro de que se muestran algunos encabezados o "no", puede agregar esto a su archivo de configuración

<system.webServer> <modules> <add name="HeadersModule " type="MyNamespace.Modules.HeadersModule " /> </modules> <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> <remove name="Server" /> <remove name="X-AspNet-Version" /> <remove name="X-AspNetMvc-Version" /> </customHeaders> <redirectHeaders> <clear /> </redirectHeaders> </httpProtocol> </system.webServer>

4) Pruebe todas las páginas, también conocido como 404, páginas de error, nombres de ruta extraños, porque pueden filtrar ciertos encabezados o mostrar encabezados que no esperaba.