Причина это не работает для вас, что вы сплавлены два немного разных «ароматов» чего-то, что реализует IHttpHandler
.
Есть два способа, которые можно реализовать в IHttpHandler с asp.net:
- Создать класс, который реализует
IHttpHandler
, например, MyCustomHandler.cs
. Этот тип обработчика не будет отвечать на любые запросы без настройки в файле web.config.
- Создайте файл
.ashx
(что похоже, что вы сделали), например. MyOtherHandler.ashx
. Этот тип обработчика будет отвечать на любые запросы на его URL-адрес, например. http://localhost/MyOtherHandler.ashx
Первый тип требует, чтобы записи в файле web.config работали, а второй - нет. Вот почему вы видите обработчиков .ashx
, отвечающих на все HTTP-глаголы, потому что они обрабатываются частью структуры asp.net, которая отвечает на запросы файлов .ashx, а не запускается вашим файлом web.config , Если вы используете IIS Express, вы можете увидеть, что это настроено в файле %USERPROFILE%\Documents\IISExpress\config\applicationhost.config
. Поиск «.ashx», и вы увидите строку, подобную ниже в разделе <system.webServer><handlers>
:
<add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx"
verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory"
preCondition="integratedMode,runtimeVersionv4.0" />
Это равносильно тому, что вы добавлял к вашему web.config, но несет ответственность за сообщение IIS/asp.net «реагировать на любые URL-адреса, которые заканчиваются в .ashx
с любым из перечисленных глаголов при наличии кода в сделке типа System.Web.UI.SimpleHandlerFactory
с ним. Этот код загружает файл .ashx
.
чтобы создать обработчик, который может ответьте на любой адрес, который вы выберете, вам нужно (короче) файл .cs
, содержащий что-то похожее:
using System.Web;
namespace HttpHandlers
{
public class Handler4 : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
context.Response.Write("Hello World from Handler4.cs");
}
}
}
Вы можете подключить его в файл web.config с:
<add name="Handler4" verb="POST" path="Handler4.ashx" type="HttpHandlers.Handler4, HttpHandlers" />
ПРИМЕЧАНИЕ: Мой проект, который я создал, чтобы проверить это называется «HttpHandlers», следовательно, объявление типа, что я указал в этом фрагменте web.config.
Большое спасибо за очень хорошее объяснение! Теперь понятно :) –
@IgorGoroshko, рад помочь :) Надеюсь, он работает так же ясно! :) – Rob
Я так надеялся, но, к сожалению, сейчас у меня ошибка 404. Ресурс не может быть найден. Нужно ли мне что-то делать? Или, может быть, это не работает, потому что я использую IIS Express? –