HttpHandler стреляют, только если файл не существует

Я пытаюсь создать обработчик HTTP для обрабатывания всех запросов к папке, но я только хочу, чтобы это стреляло, если файлы, которые требуют, не существуют (EG: Запрос наталкивается на файл X, если X существует, я хотел бы служить файлу, иначе обработчик должен иметь дело с ним).

Файлы только будут статическим содержанием, не сами сценарии, которые я принимаю, делают его немного легче, но я, может казаться, не нахожу ничего, что добьется цели... У кого-либо есть какие-либо идеи? Я предполагаю, что это может быть сделано, так как IIS7 переписывают модуль, может управлять им, но я не вижу как...

Редактирование Просто для уточнения... обработчик является типичным случаем, и это не процедура обработки ошибок, но на самом деле поставка соответствующего содержания. Я просто хочу способность добавить новые файлы к папке или как отдельные вещи или как перегрузки к тому, что поставил бы обработчик.

7
задан fyjham 15 February 2010 в 22:49
поделиться

3 ответа

В итоге я решил использовать обработчик и вместо этого использовал следующее для решения проблемы:

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

Учитывая, что так много людей выступали за Модули и отлавливание исключений, я чувствую, что мне следует пояснить, почему я не слушал:

  1. Это стандартный поток программы, поэтому мне не нравится идея использовать исключение для его запуска, если это не становится абсолютно необходимым.
  2. Это фактически возвращает контент при нормальных обстоятельствах. Идея HttpModule на самом деле обрабатывает типичные запросы, а не просто выполняет некоторую базовую совместную обработку и обработку крайних случаев, кажется немного неуместной. Поэтому я предпочитаю использовать HttpHandler, поскольку он обрабатывает типичные запросы.
9
ответ дан 6 December 2019 в 15:21
поделиться

Если вы предпочитаете не создавать HttpModule, я могу придумать два хака:

  1. Используйте что-то вроде mod-rewrite на Apache или II7 rewrite на IIS, чтобы разрешить определенные URL-адреса, которые существуют, пройти, взять что-нибудь еще и перенаправить его в ваш статический файл. Это может быть большой список, и я бы рекомендовал использовать этот хак только в том случае, если у вас небольшое количество файлов.
  2. Измените структуру URL для поддержки сценария маршрутизации, который может проверять, существует ли файл, и возвращать его при необходимости. Такой подход, скорее всего, повлияет на кеширование, поэтому будьте осторожны.

Джейкоб

0
ответ дан 6 December 2019 в 15:21
поделиться

Вероятно, вы захотите реализовать HttpModule. В противном случае вы будете бороться со всеми другими HttpHandlers, которые борются за запрос.

Это должно помочь вам начать....

Вы можете решить, где в жизненном цикле запроса вы хотите выполнять проверку и реагировать. Смотрите эту статью для некоторой истории

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>
5
ответ дан 6 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: