Я пытаюсь создать обработчик HTTP для обрабатывания всех запросов к папке, но я только хочу, чтобы это стреляло, если файлы, которые требуют, не существуют (EG: Запрос наталкивается на файл X, если X существует, я хотел бы служить файлу, иначе обработчик должен иметь дело с ним).
Файлы только будут статическим содержанием, не сами сценарии, которые я принимаю, делают его немного легче, но я, может казаться, не нахожу ничего, что добьется цели... У кого-либо есть какие-либо идеи? Я предполагаю, что это может быть сделано, так как IIS7 переписывают модуль, может управлять им, но я не вижу как...
Редактирование Просто для уточнения... обработчик является типичным случаем, и это не процедура обработки ошибок, но на самом деле поставка соответствующего содержания. Я просто хочу способность добавить новые файлы к папке или как отдельные вещи или как перегрузки к тому, что поставил бы обработчик.
В итоге я решил использовать обработчик и вместо этого использовал следующее для решения проблемы:
if (File.Exists(context.Request.PhysicalPath)) context.Response.TransmitFile(context.Request.PhysicalPath);
else { /* Standard handling */ }
Учитывая, что так много людей выступали за Модули и отлавливание исключений, я чувствую, что мне следует пояснить, почему я не слушал:
Если вы предпочитаете не создавать HttpModule, я могу придумать два хака:
Джейкоб
Вероятно, вы захотите реализовать 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>