gpt4 book ai didi

c# - 为什么我的嵌套 HttpModule EndRequest 事件处理程序没有触发?

转载 作者:IT王子 更新时间:2023-10-29 03:45:49 26 4
gpt4 key购买 nike

当我尝试在 MVC 5.2.2 和 .NET 4.6 上的嵌套 HttpModule 中使用 EndRequest 事件处理程序修改 header 时,我遇到了一些奇怪的行为。 2.如果我不修改我的顶级 HttpModule 中的 EndRequest,嵌套的 HttpModule 中的事件处理程序似乎永远不会触发,即使我知道在嵌套的 HttpModule 上调用了 Init

我的问题是,我下面的代码中发生了什么以防止“TestNested” header 出现在响应 header 中,除非我包含注释掉的代码以添加一个不执行任何操作的 EndRequest 事件处理程序?


动态注册我的顶级HttpModule

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

从单个顶级模块调用我所有其他 HttpModules 上的 Init

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();
}
}
}
}

修改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
}
}
}

最佳答案

我也想修改我的标题,但我需要尽可能隐藏。添加或删除或两者都相同,只是标题。

1) 您可以在 global.asax 中设置 MvcHandler.DisableMvcResponseHeader = true;

        protected void Application_Start()
{
MvcHandler.DisableMvcResponseHeader = true;
}

and

protected void Application_PreSendRequestHeaders()
{
Response.Headers.Remove("Server");
Response.Headers.Remove("X-AspNet-Version");
}

2) 你不应该为几乎相同的工作真正使用 diff 模块,而是创建一个只处理头修改的 HeadersModule,并使用 PreSendRequestHeaders 添加或删除你想要的任何标题。您始终可以使用要添加或删除的 header 列表注入(inject)一些服务。

    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) 为了更加确定一些 header 显示或“不”显示,您可以将其添加到您的配置文件中

  <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) 测试所有页面,也就是 404、错误页面、奇怪的路径名,因为它们可能会泄漏某些 header 或显示您没有预料到的 header 。

关于c# - 为什么我的嵌套 HttpModule EndRequest 事件处理程序没有触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42144188/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com