簡體   English   中英

IIS7,RewritePath和IIS日志文件

[英]IIS7, RewritePath and IIS log files

我在IIS7上運行的ASP.NET 3.5應用程序中使用Context.RewritePath()。

我在應用程序BeginRequest事件中做它,一切工作文件。

/ sports的請求被正確地重寫為default.aspx?id = 1,依此類推。

問題是在我的IIS日志中,我看到了對/Default.aspx?id=1的GET請求,而不是/ sports。

這種代碼在IIS6下運行良好。

由於必須實現某些業務邏輯,因此不能使用Microsoft Rewrite模塊。

謝謝。

編輯:

似乎我的處理程序在管道中太早了,但是如果我將邏輯移動到后來的事件,那么整個重寫的東西都不起作用(為時已晚,StaticFileHandler接收我的請求)。

我用Google搜索並用Google搜索,問道,不敢相信沒有人有這個問題?

編輯:

哎呀! 這是我在IIS論壇上發現的內容:

“這是因為在集成模式下,IIS和asp.net共享一個公共管道,現在IIS可以看到RewritePath,而在IIS6中,它甚至沒有被IIS看到 - 你可以通過使用經典模式來解決這個問題IIS6“。

最后更新 :請看下面的答案 ,我在生產環境中使用了一年多的時間后對結果進行了更新。

經過一番研究,我終於找到了問題的解決方案。

我已使用新的(在ASP.NET 3.5中引入) Context.Server.TransferRequest()方法替換了對Context.RewritePath()方法的調用。

現在看起來很明顯,但IIS Core團隊的事件高級開發工程師並沒有想到這一點。

我已經測試了它的會話,身份驗證,回發,查詢字符串......問題,但沒有找到。

Tommorow我會將更改部署到一個非常高的流量站點,我們很快就會知道它是如何工作的。 :)

我會回來更新。

更新:解決方案仍然不完全在我的生產服務器上,但它已經過測試,它確實有效,據我所知,到目前為止,它是我的問題的解決方案。 如果我在生產中發現任何其他內容,我會發布更新。

最后的更新:我已經在生產中使用了這個解決方案超過一年,它已被證明是一個良好而穩定的解決方案,沒有任何問題。

您可以在處理請求之后但在IIS日志記錄模塊寫入日志條目之前將路徑設置回原始值。

例如,此模塊重寫BeginRequest上的路徑,然后將其設置回EndRequest上的原始值。 使用此模塊時,原始路徑將顯示在IIS日志文件中:

public class RewriteModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += OnBeginRequest;
        context.EndRequest += OnEndRequest;
    }

    static void OnBeginRequest(object sender, EventArgs e)
    {
        var app = (HttpApplication)sender;
        app.Context.Items["OriginalPath"] = app.Context.Request.Path;
        app.Context.RewritePath("Default.aspx?id=1");
    }

    static void OnEndRequest(object sender, EventArgs e)
    {
        var app = (HttpApplication)sender;
        var originalPath = app.Context.Items["OriginalPath"] as string;
        if (originalPath != null)
        {
            app.Context.RewritePath(originalPath);
        }
    }

    public void Dispose()
    {

    }
}

我有完全相同的問題。 解決此問題的一種方法是使用Server.Transfer而不是Context.RewritePath。 Server.Transfer不會重新啟動整個頁面生命周期,因此仍會記錄原始URL。 確保為“preserveForm”參數傳遞“true”,以便QueryString和Form集合可用於第2頁。

老問題,但我發現當我做以下事情時我沒有遇到你的問題:

a)web.config中的重寫規則,用於將所有請求定向到/default.aspx,例如:

    <rule name="all" patternSyntax="Wildcard" stopProcessing="true">
      <match url="*"/>
      <action type="Rewrite" url="/default.aspx"/>
    </rule>

b)在default.aspx的Page_PreInit事件中調用RewritePath,將URL和查詢字符串重寫為請求中傳遞的內容(即不存在的位置)。

例如,我請求“/ somepage /?x = y”(不存在)。

a)Web.config規則將其映射到/default.aspx

b)Page_PreInit將其重寫回“/ somepage /?x = y”。

在IIS 7(Express和生產)中,結果是服務器日志反映了存根的“/ somepage”和查詢的“x = y”,並且所有Request對象屬性都反映了請求的(不存在的)URL(這就是我想要的)。

唯一奇怪的效果是,在IIS Express中,日志項被寫入兩次。 但是,這不會在生產中發生(Windows Server 2008 R2)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM