的問題待了幾天,我發現了:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
應達到的結果(如果我想用在Global.asax中Application_Error
),但我猜測,父網站的需求這個選項也被設置爲真。
由於我無法使它工作,我試過我的運氣,錯誤處理HttpModule
,但StaticFile
處理程序似乎擊敗我處理靜態文件上的錯誤,所以也沒有工作。
我試着用HttpError解決這個
<system.webServer>
<httpErrors>
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" prefixLanguageFilePath="" path="/Error404.aspx" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
頁,這工作好,因爲ExecuteURL
導致重寫而不是重定向。我不必以任何方式劫持標準文件處理,並且我可以在文件丟失時執行我的代碼(我將它放在aspx.cs文件的Page_Load
中)。此解決方案有一個問題,它只適用於單個應用程序池。如果您的子應用程序運行在不同的應用程序池中,則在子應用程序內部使用ExecuteURL
錯誤將導致空白403錯誤(重定向到錯誤頁面確實有效,但不是我想要的)。 subapp背後的想法不是修改父站點(實際上是站點),所以這是不行的。
最後我寫了一個靜態文件的處理程序(只有jpeg),這工作正常。我甚至不需要將runAllManagedModulesForAllRequests
設置爲true。我唯一擔心的是,它可能不像常規的StaticFile
處理程序那樣。
public class JpegHandler : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
var url = context.Request.Url.PathAndQuery;
var path = context.Server.MapPath(url);
try
{
if (File.Exists(path) || TryRecreateFile(url)) // TryRecreateFile attempts to create the file and if it succeeds, it returns true
{
context.Response.Clear();
context.Response.ContentType = "image/jpeg";
context.Response.TransmitFile(path);
//Response.End(); // TransmitFile already Ends the response
return;
}
}
catch (Exception ex)
{
context.Response.StatusCode = 500;
Logger.LogException(ex);
return;
}
context.Response.StatusCode = 404;
}
}
在web.config中:
<system.webServer>
<handlers>
<add name="jpgs" path="*.jpg" verb="GET" type="JpegHandler" resourceType="Unspecified" preCondition="integratedMode" />
</handlers>
</system.webServer>
您應該使用集成模式,寫一個HTTP模塊來處理使用錯誤的事件,與其。錯誤事件僅適用於ASP.NET請求,並且在IIS處理靜態文件請求時不起作用。 –
您還需要爲al請求啓用此託管模塊。 –
@LexLi經過大量的試驗和錯誤之後,我發現最好的兩個解決方案是使用'httpError'頁面(請參閱答案)並編寫一個http處理程序。第一個不適用於subapps,所以我使用了第二個。使用http模塊看起來是個不錯的主意,但由於各種原因,它們不適用於靜態文件。爲了使它工作,我將不得不寫我自己的靜態文件處理程序,這種模塊使冗餘。我們可以刪除以前對這個問題的評論。 – jahu