我已經創建了一個HttpModule
:的BeginRequest被調用兩次
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>
這表明它i每次都有相同的上下文。 這是怎麼發生的?Request
對象中有很多字段,但我無法在兩次調用中發現它們之間的任何差異。是否有一些財產,我應該檢查,給出了一個「階段」,我應該只響應其中之一?
我在網站上發現了一些相關的問題,但其中大部分似乎都傾向於尋找其他資源的網絡瀏覽器,例如favicon.ico
,在這裏情況並非如此。
MSDN在BeginRequest
的細節上似乎有點亮,所以到目前爲止我還沒有找到很多幫助。
我可能會錯過某些明顯的東西,這是我第一次遇到.NET/IIS等,我通常是一個Java開發人員。
更新:
我已經傾倒的Request
所有的公共屬性,這是兩者之間的區別:
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
頭是越來越第二呼叫建立。這不是在請求curl
提出的要求:
> GET /example HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:2017
> Accept: */*
此IIS試圖幫助嗎?在處理完整個請求後,它知道主體有多長時間(0)並用該集合再次調用它?
這個問題可以隱藏在很多地方... 我建議設置一個斷點,其中響應值附加字符串,看看它將何時觸發2 - 時間。 檢查呼叫堆棧以查看誰發起了第二次呼叫。 – Nikita
有沒有辦法讓IISExpress進入某種調試模式?我在調用堆棧中看到的是'DoBeginRequest',前面有'[External code]' – Stik
非常有趣的IIS行爲......您可能會發現這篇文章很有用,但是它的解決方案在我們的例子中不起作用:http:// erraticdev.blogspot.com/2011/01/how-to-correctly-use-ihttpmodule-to.html – Nikita