2010-02-15 38 views
7

Tôi đang cố gắng tạo trình xử lý HTTP để xử lý tất cả các yêu cầu tới một thư mục nhưng tôi chỉ muốn kích hoạt nếu các tệp được yêu cầu không tồn tại (EG: Yêu cầu đến tập tin X, nếu X tồn tại tôi muốn phục vụ các tập tin, nếu không xử lý nên đối phó với nó).HttpHandler chỉ cháy nếu tập tin không tồn tại

Các tệp sẽ chỉ là nội dung tĩnh chứ không phải bản thân kịch bản mà tôi cho là dễ hơn một chút nhưng tôi dường như không tìm thấy bất kỳ thứ gì có thể thực hiện được ... Bất kỳ ai cũng có ý tưởng? Tôi giả sử nó có thể được thực hiện kể từ khi mô-đun viết lại IIS7 có thể quản lý nó, nhưng tôi không thể thấy cách ...

Chỉnh sửa Chỉ cần làm rõ ... trình xử lý là trường hợp điển hình và nó không phải là lỗi -làm thủ tục nhưng thực sự cung cấp nội dung phù hợp. Tôi chỉ muốn khả năng thêm tập tin mới vào thư mục hoặc là những thứ riêng biệt hoặc là quá tải đến những gì mà trình xử lý sẽ phân phối.

+0

mẫu mã hoạt động trong câu trả lời. –

Trả lời

9

tôi đã kết thúc gắn bó với một handler và thay vào đó bằng cách sử dụng sau đây để giải quyết vấn đề:

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

Với rất nhiều người ủng hộ Modules và ngoại lệ bắt tôi cảm thấy tôi nên làm rõ lý do tại sao tôi không nghe:

  1. Đây là dòng chương trình tiêu chuẩn, như vậy tôi không thích ý tưởng sử dụng một ngoại lệ để kích hoạt nó trừ khi nó trở nên hoàn toàn cần thiết.
  2. Điều này thực sự trả lại nội dung trong các trường hợp bình thường. Ý tưởng của một HttpModule thực sự xử lý các yêu cầu điển hình hơn là chỉ làm một số xử lý chia sẻ cơ bản và xử lý các trường hợp cạnh có vẻ hơi lệch. Vì vậy, tôi thích sử dụng HttpHandler hơn vì nó xử lý các yêu cầu điển hình.
+1

Đủ công bằng - câu trả lời cuối đêm-về-ý thức của tôi dựa trên việc có A). đã thực hiện điều này bằng cách sử dụng một trình xử lý ngoại lệ toàn cục mở rộng và B).tối ưu hóa cho trường hợp tệp * hiện * tồn tại. Tôi nghĩ bạn có cách tiếp cận đúng đắn nơi bạn muốn tối ưu hóa cho trường hợp 404. – annakata

+0

Đối với phần còn lại của chúng tôi, @annakata, câu trả lời của bạn đi đâu? Giải pháp: ( – BrainSlugs83

+0

của annakata), như tôi nhớ, rất giống với giải pháp của Sky Sanders dưới đây, sử dụng HttpModule để xử lý khi tập tin không tồn tại thay vì sử dụng HttpHandler để xử lý cả hai trường hợp. ứng dụng cụ thể thực sự đi xuống để phản ánh ý định thiết kế thực sự chính xác hơn (Trường hợp tôi khuyên bạn nên xử lý từ hai điểm chấm trong câu trả lời của tôi). – fyjham

5

Có thể bạn sẽ muốn triển khai một HttpModule. Nếu không, bạn đang chiến đấu với tất cả các HttpHandlers khác đang cạnh tranh với yêu cầu.

này sẽ giúp bạn bắt đầu ....

Bạn có thể quyết định nơi trong vòng đời yêu cầu bạn muốn thực hiện kiểm tra và phản ứng. Xem this article đối với một số nền

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

Nếu bạn muốn không tạo ra một HttpModule, tôi có thể nghĩ đến hai hacks:

  1. Sử dụng một cái gì đó giống như mod-viết lại trên Apache hoặc II7 viết lại trên IIS để cho phép các URL cụ thể tồn tại để trải qua, lấy bất kỳ thứ gì khác và chuyển hướng nó đến tệp tĩnh của bạn. Đây có thể là một danh sách lớn và tôi chỉ khuyên bạn nên triển khai hack này nếu bạn chỉ có một số lượng nhỏ các tệp.
  2. Thay đổi cấu trúc URL của bạn để hỗ trợ tập lệnh định tuyến có thể kiểm tra xem tệp có tồn tại không và trả lại tệp đó khi thích hợp. Cách tiếp cận này có thể sẽ ảnh hưởng đến bộ nhớ đệm, vì vậy hãy thận trọng.

Jacob

Các vấn đề liên quan