2010-02-15 97 views
7

我正在嘗試創建一個HTTP處理程序來處理對文件夾的所有請求,但我只希望在請求的文件不存在的情況下觸發它(EG:Request for for文件X,如果X存在我想提供該文件,否則處理程序應該處理它)。HttpHandler只有在文件不存在的情況下才會觸發

這些文件將只是靜態內容,而不是腳本本身,我認爲它使得它更容易一點,但我似乎無法找到任何可以做到這一點的任何東西......任何人有任何想法?我認爲它可以完成,因爲IIS7重寫模塊可以管理它,但我不知道如何...

編輯只是爲了澄清...處理程序是典型的情況下,它不是一個錯誤處理例程,但實際提供適當的內容。我只是希望能夠將新文件添加到文件夾,作爲單獨的東西或作爲處理程序將傳遞的重載。

+0

工作代碼示例在答案中。 – 2010-02-16 01:18:26

回答

9

我已經結束了與處理器貼合,而不是使用下面要解決的問題:

if (File.Exists(context.Request.PhysicalPath)) context.Response.TransmitFile(context.Request.PhysicalPath); 
else { /* Standard handling */ } 

鑑於如此多的人主張模塊和捕獲異常,我覺得我應該澄清爲什麼我沒聽:

  1. 這是標準的程序流程,因爲我不喜歡使用例外觸發它的想法除非它變得絕對必要。
  2. 這實際上是在正常情況下返回內容。 HttpModule實際上處理典型請求的想法,而不僅僅是做一些基本的共享處理和處理邊緣案例似乎有點偏離。因此,我更喜歡使用HttpHandler,因爲它正在處理典型的請求。
+1

夠公平 - 我深夜的意識流答案是基於A)。已經利用現有的全局異常處理程序完成了這一工作,並且B)。針對文件*存在的情況進行優化。我認爲你有正確的方法,你想爲404案例進行優化。 – annakata 2010-02-16 19:55:17

+0

對於我們其他人,@annakata,你的答案去了哪裏? :( – BrainSlugs83 2012-10-13 06:38:36

+0

)我記得,annakata的解決方案非常類似於下面的Sky Sanders的解決方案,當文件不存在時,使用HttpModule接管處理,而不是使用處理兩種情況的HttpHandler。特定的應用程序真的可以歸結爲更準確地反映真正的設計意圖(我建議處理程序的情況來自我答案中的兩個點)。 – fyjham 2012-11-19 03:49:27

5

也許你會想實現一個HttpModule。否則,你正在與爭奪請求的所有其他HttpHandler進行鬥爭。

這應該讓你開始....

您可以決定在請求生命週期要執行的檢查和反應。見this article一些背景

using System; 
using System.IO; 
using System.Web; 

namespace RequestFilterModuleTest 
{ 
    public class RequestFilterModule : IHttpModule 
    { 
     #region Implementation of IHttpModule 

     /// <summary> 
     /// Initializes a module and prepares it to handle requests. 
     /// </summary> 
     /// <param name="context"> 
     /// An <see cref="T:System.Web.HttpApplication"/> that provides access to the methods, 
     /// properties, and events common to all application objects within an ASP.NET application 
     /// </param> 
     public void Init(HttpApplication context) 
     { 
      context.BeginRequest += ContextBeginRequest; 
     } 

     /// <summary> 
     /// Disposes of the resources (other than memory) used by the module that implements <see cref="T:System.Web.IHttpModule"/>. 
     /// </summary> 
     public void Dispose() 
     { 
     } 

     private static void ContextBeginRequest(object sender, EventArgs e) 
     { 
      var context = (HttpApplication) sender; 

      // this is the file in question 
      string requestPhysicalPath = context.Request.PhysicalPath; 

      if (File.Exists(requestPhysicalPath)) 
      { 
       return; 
      } 

      // file does not exist. do something interesting here..... 
     } 

     #endregion 
    } 
} 

<?xml version="1.0"?> 
<configuration> 
    ............................... 
    <system.web> 
    ........................... 
     <httpModules> 
      <add name="RequestFilterModule" type="RequestFilterModuleTest.RequestFilterModule"/> 
      <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     </httpModules> 
    </system.web> 
    ................... 
</configuration> 
0

如果你寧願不創建一個HttpModule,我能想到2名黑客:

  1. 使用像國防部重寫上Apache或II7會在IIS上重寫,以允許存在的特定URL經歷其他任何操作並將其重定向到靜態文件。這可能是一個很大的列表,如果你只有少量的文件,我只會推薦實施這個黑客。
  2. 更改您的URL結構以支持路由腳本,該腳本可以檢查文件是否存在並在適當時返回。這種方法可能會影響緩存,所以請謹慎使用。

雅各

相關問題