Я создал 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.
Update:
Я бросил все открытые свойства из 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) и вызывает его снова с этим набором?
Проблема может скрыться во многих местах ... Я предлагаю установить точку останова, где значение Response добавляется к строке, и посмотреть, когда она будет запущена для 2 и время. Проверьте стек вызовов, чтобы узнать, кто инициировал 2-й вызов. – Nikita
Есть ли способ поставить IISExpress в какой-то режим отладки? Все, что я вижу в стеке вызовов, это 'DoBeginRequest', предшествующий' [Внешний код] ' – Stik
Очень интересное поведение IIS ... вы можете найти эту статью полезной, но решение от нее не будет работать в нашем случае: http: // erraticdev.blogspot.com/2011/01/how-to-correctly-use-ihttpmodule-to.html – Nikita