gpt4 book ai didi

c# - BeginRequest 被调用两次

转载 作者:行者123 更新时间:2023-12-02 04:00:41 25 4
gpt4 key购买 nike

我创建了一个HttpModule:

using System;
using System.Web;

public class TestModule : IHttpModule
{
public TestModule() { }

public String ModuleName { get { return "TestModule"; } }

public void Dispose() { }

public void Init(HttpApplication app)
{
app.BeginRequest += (new EventHandler(this.DoBeginRequest));
}

private void DoBeginRequest(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("<pre>Request URL: " + context.Request.FilePath + "</pre>");
context.Response.Flush();
System.Diagnostics.Debug.WriteLine(context.Request.ToString());
}
}

像这样加载:

<system.webServer>
<modules>
<add name="TestModule" type="TestModule"/>
</modules>
</system.webServer>

当我从网络浏览器或 curl 调用它时,我在“输出”选项卡中看到两行日志,并且我看到以下响应:

<pre>Request URL: /example</pre><pre>Request URL: /example</pre>

表示每次都是同一个Context。 为什么会这样? Request 对象中有很多字段,但我无法在这两个调用中发现它们之间的任何区别。是否有一些我应该检查的属性提供了一个我应该只响应其中之一的“阶段”?

我在网站上发现了一些相关的问题,但其中大多数似乎都倾向于它是网络浏览器正在寻找另一个资源,比如 favicon.ico,而那不是这里的案例。

MSDN BeginRequest 的细节似乎有点不详,所以到目前为止我还没有找到很多帮助。

我可能遗漏了一些明显的东西,这是我第一次接触 .NET/IIS 等,我通常是 Java 开发人员。

更新:

我已经丢弃了 Request 的所有公共(public)属性,这是两者之间的区别:

Headers == Accept=*%2f*&Host=localhost%3a2017&User-Agent=curl%2f7.35.0
Headers == Content-Length=0&Accept=*%2f*&Host=localhost%3a2017&User-Agent=curl%2f7.35.0

具体来说,Content-Length header 是在第二次调用时设置的。这在 curl 发出的请求中不存在:

> GET /example HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:2017
> Accept: */*

此 IIS 是否有帮助?处理完整个请求后,它知道正文的长度 (0) 并使用该集合再次调用它?

最佳答案

好吧,在经历了很多挫折之后,我发现特定的 URL 不会受到这种行为的影响。带有“扩展名”的 URL 不会这样做:

curl http://localhost:2017/test
> BeginRequest
> BeginRequest

curl http://localhost:2017/test.abc
> BeginRequest

curl http://localhost:2017/.a
> BeginRequest

通过更多的在线挖掘,我发现了对名为 ExtensionlessUrl-Integrated-4.0 的处理程序的引用,该处理程序由主配置文件 applicationhost.config 加载。我真的不知道这是在做什么,也不知道为什么它会导致请求重复,但在我自己的 web.config 中明确删除它已经解决了问题:

   <system.webServer>
<handlers>
<remove name="ExtensionlessUrl-Integrated-4.0" />
</handlers>
<modules>
<add name="TestModule" type="TestModule"/>
</modules>
</system.webServer>

我必须承认,我有点害怕以后可能会遇到的其他类似陷阱 - applicationhost.config 加载了 很多 其他处理程序和模块,任何在我的模块能够处理它之前,其中的一些可能会弄乱这样的东西。但这是另一天的问题......

关于c# - BeginRequest 被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42072183/

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