2015-07-02 78 views
0

我寫了一個asp.net應用程序,當找到匹配請求url的文件時,應該什麼也不做,但是當文件不存在時,它會得到生成(基於url中的某些信息),然後用戶被重定向到現有文件(相同的url)。我在global.asax中使用Application_Error來實現它,它在本地運行,但不適用於遠程服務器(在MVC應用程序中作爲應用程序添加它)。我知道問題出在IIS處理遠程服務器上的文件請求,但我不知道如何使它不能處理這些請求。我只需要asp.net subapp來處理它自己的作用域(路徑)中的那些文件請求,但繼續在其他地方使用IIS(除了subapp的路徑之外,父MVC應用程序)。那麼我該如何做到這一點(我已經看到了另一個MVC應用程序的這項工作,但我不確定它是如何工作的)?做一個asp.net subapp處理文件請求,而不是IIS

我已經嘗試切換應用程序池到經典和改變IIS和web.config中的處理程序映射,但都沒有訣竅。我還發現了有關在asp.net中創建類似靜態文件的路由的信息,但是從我所瞭解的情況來看,即使相應的文件存在,這些處理請求也是如此,所以它不是我所需要的。

+0

您應該使用集成模式,寫一個HTTP模塊來處理使用錯誤的事件,與其。錯誤事件僅適用於ASP.NET請求,並且在IIS處理靜態文件請求時不起作用。 –

+0

您還需要爲al請求啓用此託管模塊。 –

+0

@LexLi經過大量的試驗和錯誤之後,我發現最好的兩個解決方案是使用'httpError'頁面(請參閱答案)並編寫一個http處理程序。第一個不適用於subapps,所以我使用了第二個。使用http模塊看起來是個不錯的主意,但由於各種原因,它們不適用於靜態文件。爲了使它工作,我將不得不寫我自己的靜態文件處理程序,這種模塊使冗餘。我們可以刪除以前對這個問題的評論。 – jahu

回答

0

的問題待了幾天,我發現了:

<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>