2012-08-01 75 views
2

我有我們的服務器上安裝一個HTTP模塊。奇怪的是它有效,但每隔一段時間它就不會被執行。我有日誌記錄,並且在它無法工作的時候,它不會到達記錄日誌的代碼。我在IIS日誌或事件查看器中看不到任何東西。的HttpModule不叫在每次請求

namespace RedirectModule 
    { 
     public class RedirectModule : System.Web.IHttpModule 
     { 
      private const string MobileUserAgent = "MobileUserAgentCacheKey"; 

      private const string 

STRING_TO_FIND = "info/lps"; 
     private const string STRING_TO_ADD = "/mobile"; 


     public void Dispose() 
     { 
      //clean-up code here. 
     } 

     public void Init(HttpApplication context) 
     {   
      context.BeginRequest += context_BeginRequest; 
     } 
     private static object sync = new object(); 
     private void context_BeginRequest(object sender, EventArgs e) 
     { 

      try 
      { 


       HttpContext context = HttpContext.Current; 


       string url = context.Request.Url.ToString().ToLower(); 

       if (!url.Contains(STRING_TO_FIND) || url.Contains(STRING_TO_FIND + STRING_TO_ADD)) 
        return; 
       Logger.Current.Log("Starting Redirect Phase"); 

       if (XmlToValues.IsMobile(context.Request.ServerVariables["HTTP_USER_AGENT"], 
             GetCachedFile(context, "Settings.xml"))) 
       { 
        var mobileRedirect = GetRedirectUrl(url, STRING_TO_FIND, STRING_TO_ADD); 
        if (mobileRedirect != null) 
        { 
         Logger.Current.Log("Redirect to Mobile page"); 
         context.Response.Redirect(mobileRedirect); 

        } 
       } 
       Logger.Current.Log("Web Page"); 
       Logger.Current.Log("End Begin Request"); 
      } 
      catch (Exception ex) 
      { 
       if (ex is ThreadAbortException) 
        return; 

       Logger.Current.LogError(ex); 

      } 
     } 


     public static string GetRedirectUrl(string url, string strToFind, string strToAdd) 
     { 
      try 
      { 
       Logger.Current.Log("Get Redirect Url "); 
       int idx = url.IndexOf(strToFind) + strToFind.Length; 
       return url.Substring(0, idx) + strToAdd + url.Substring(idx); 
      } 
      catch (Exception ex) 
      { 

       Logger.Current.LogError(ex); 


       return null; 
      } 
     } 



     private XmlNodeList GetCachedFile(HttpContext context, string filePath) 
     { 
      try 
      { 
       Logger.Current.Log("GetCachedFile START"); 
       if (context.Cache[MobileUserAgent] == null) 
       { 
        context.Cache[MobileUserAgent] = XmlToValues.GetMobileUserAgents(filePath); 
        Logger.Current.Log("Add Mobile File to Cache"); 
       } 
       return (XmlNodeList)context.Cache[MobileUserAgent]; 
      } 
      catch (Exception ex) 
      { 
       Logger.Current.LogError(ex); 

       return null; 
      } 
     } 

    } 
} 

和我的web.config:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- 
    For more information on how to configure your ASP.NET application, please visit 
    http://go.microsoft.com/fwlink/?LinkId=169433 
    --> 
<configuration> 


    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <remove name="RedirectModule" /> 
     <add name="RedirectModule" type="RedirectModule.RedirectModule, RedirectModule" /> 


    </modules> 
    <handlers> 
     <remove name="Redirect" /> 
    </handlers> 
    <validation validateIntegratedModeConfiguration="false"/> 
    </system.webServer> 
    <system.web> 
    <httpModules> 
     <add name="RedirectModule" type="RedirectModule.RedirectModule, RedirectModule" /> 
    </httpModules> 
    <compilation debug="true">  
    </compilation> 
    </system.web> 
</configuration> 

附:我拿出web.config中的log4net,因爲它很麻煩。

這裏的鏈接到項目:http://www.sendspace.com/file/w42me5

這是被請求的頁面的標記,它是在一個名爲index.htmnl文件:

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
<!-- no cache headers --> 
<meta http-equiv="Pragma" content="no-cache"> 
<meta http-equiv="no-cache"> 
<meta http-equiv="Expires" content="-1"> 
<meta http-equiv="Cache-Control" content="no-cache"> 
<!-- end no cache headers --> 
</head> 
<body> 
MOBILE 
</body> 
</html> 
+0

你有記錄的URL在的BeginRequest處理程序的開始,以確認它是正確的,不必返回早期,因爲URL不包含預期的字符串? – 2012-08-05 06:52:52

+0

是的,我登錄了Begin_Request,當它工作時,它記錄請求。當它不記錄請求時。我已經添加了嘗試,並抓住日誌記錄,所以它不應該拋出一個錯誤。事件日誌中沒有任何內容表示錯誤。我已將無緩存標記添加到html頁面我試圖達到 – Eitan 2012-08-05 08:46:21

+0

在您的HttpModule BeginRequest事件未被擊中的情況下,Global.asax中的BeginRequest被擊中了嗎?你總是要求一個ASPX?你能分享正在被請求的頁面的標記嗎? – 2012-08-05 12:29:12

回答

0

我也有類似prblem ...嘗試在您的瀏覽器中關閉緩存並重試。爲了關閉這個請求的緩存,你需要修改響應頭。 Example on modifying caching option

+0

感謝您的輸入!我認爲同樣的事情,我一直在Chrome的隱身模式下工作,並在我使用手機進行檢查時清除Safari中的緩存。我添加了標題,但每隔一段時間它仍然不起作用。 – Eitan 2012-08-01 13:04:01

0

這聽起來像你可能打某處瀏覽器和服務器之間的高速緩存。有很多潛在的地方可緩存是,這裏的一些一般步驟,試圖找到它:

  • 瀏覽器 - 瀏覽器不必要求它已經緩存。 This question列出了用於不同瀏覽器的工具,以確認正在發送什麼請求。
  • 客戶端計算機 - 如果正在從瀏覽器發送請求,則可能有代理(如Squid)返回緩存數據。您可以使用Fiddler來檢查HTTP請求是否離開客戶端計算機。
  • 網絡代理 - 與客戶端計算機相同,只是代理位於網絡上的某個服務器上。您將不得不在代理服務器上分析傳出的HTTP通信,以確定是否正在發送請求。
  • Web服務器 - 您的重定向模塊可以提供緩存的內容,而不是將其呈現爲新的。在這種情況下,它應該顯示在您的日誌中。將一個日誌調用添加到BeginRequest處理程序的一開始,以確認請求是否真正將其發送到您的服務器。

以防止緩存,你可以新增無緩存標頭的請求(文章here):

 private void Application_EndRequest(Object source, EventArgs e) 
     { 
      HttpApplication application = (HttpApplication)source; 
      HttpContext context = application.Context; 
      context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-100); 
      context.Response.AddHeader(「pragma」, 「no-cache」); 
      context.Response.AddHeader(「cache-control」, 「private」); 
      context.Response.CacheControl = 「no-cache」; 
     } 

編輯

調試什麼請求到達服務器

響應中的HTTP 200表明很可能您沒有緩存問題。要確認每個請求實際上都到達服務器,請嘗試向您的Application_BeginRequest處理程序(在Global.asax中)添加日誌以記錄每個請求,並將其與您的HttpModule中由context_BeginRequest生成的日誌進行比較。

//In Global.asax 
private void Application_BeginRequest(Object source, EventArgs e) { 
    Logger.Current.Log("Request made to Application_BeginRequest") 
} 

//In your HttpModule 
    private void context_BeginRequest(object sender, EventArgs e) 
    { 
     //Log before any of your other code 
     Logger.Current.Log("Request made to context_BeginRequest") 

     try 
     { 
       // your code 
     } 
     catch (Exception ex) 
     { 
      // log the exception first in case this is the problem 
      Logger.Current.LogError(ex); 

      if (ex is ThreadAbortException) 
       return; 

     } 
    } 

解釋結果

檢查你的日誌是沒有得到你的模塊的請求後。

  • 如果它說明不了什麼,請求從未到你的服務器。請參閱上述關於緩存
  • 如果您的日誌結束於對Application_BeginRequest的請求,則說明您的模塊未被調用。
  • 如果它結束於對context_BeginRequest的請求,那麼在您的記錄器導致某些請求崩潰之前,模塊代碼中存在錯誤。這可能是一個空引用HttpContext.Current或Request,或溢出問題或任何其他事物。這應該記錄在你最後的聲明中。
+0

我添加了您之前回答發佈的代碼。我從無線連接中使用我的iPhone來測試URL,並且它不會重定向到移動設備(起初它會,但過了一段時間後它會停止工作)。我添加了日誌記錄,但沒有達到Begin_request上的日誌。我還將移動重定向代碼添加到了global.asax文件中;僅僅是爲了確保它仍然沒有達到Begin_request函數中的日誌記錄代碼。 – Eitan 2012-08-05 08:18:58

+0

你可以看看這個網站:http://blogs.esri.com/esri/supportcenter/2011/12/06/configuring-fiddler-to-capture-web-traffic-from-an-iphone-ipad-device /有關在iPhone上使用Fiddler的說明。確認您的iPhone正在生成請求。如果不是這樣,那麼這實際上更像是一個iPhone爲什麼沒有遵循緩存指令的問題。 (您還應該確認您收到的原始響應已正確設置緩存標頭)。 – 2012-08-05 08:25:19

+0

緩存標題在那裏。我正在做的是要求一個簡單的.html文件。所以小提琴手不會告訴我,我正在調用HTTP模塊。它顯示我正在請求該頁面。我可以發佈鏈接到項目,它是:http://www.sendspace.com/file/w42me5 – Eitan 2012-08-05 08:34:16