2015-11-06 5 views
1

У меня есть несколько обработчиков http (IHttpHandler) в моем веб-проекте asp.net. Теперь я хочу ограничить доступ к этим обработчикам. Для Handler1 я хочу разрешить только запросы POST, а для Handler2 я хочу разрешить только запросы GET.Как ограничить доступ POST к HttpHandler?

В моих web.config я изменил <HttpHandlers> сечения, как показано ниже, но оба обработчики еще обрабатывать все типы глаголов. Есть что-то, что я пропустил? Я тестирую его с помощью IIS Express.

<httpHandlers> 
    <add verb="POST" path="Handler1.ashx" type="MyNamesapce.Handler1, MyAssembly"/> 
    <add verb="GET" path="Handler2.ashx" type="MyNamesapce.Handler2, MyAssembly"/> 
</httpHandlers> 

ответ

2

Причина это не работает для вас, что вы сплавлены два немного разных «ароматов» чего-то, что реализует 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.

+0

Большое спасибо за очень хорошее объяснение! Теперь понятно :) –

+0

@IgorGoroshko, рад помочь :) Надеюсь, он работает так же ясно! :) – Rob

+0

Я так надеялся, но, к сожалению, сейчас у меня ошибка 404. Ресурс не может быть найден. Нужно ли мне что-то делать? Или, может быть, это не работает, потому что я использую IIS Express? –