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.