[英]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.