Развертывание веб-службы HttpHandler - PullRequest
1 голос
/ 20 мая 2010

Я пытаюсь создать веб-сервис, который манипулирует http-запросами POST и GET.

Вот пример:

public class CodebookHttpHandler: IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        if (context.Request.HttpMethod == "POST")
        {
            //DoHttpPostLogic();
        }
        else if (context.Request.HttpMethod == "GET")
        {
            //DoHttpGetLogic();
        }
    }
...

public void DoHttpPostLogic()
{
...
}
public void DoHttpGetLogic()
{
...
}

Мне нужно развернуть это, но я изо всех сил пытаюсь начать. Большинство онлайн-ссылок показывают создание веб-сайта, но на самом деле все, что я хочу сделать, - это отвечать при отправке HttpPost. Я не знаю, что добавить на сайт, просто хочу, чтобы этот код запускался.

Edit: Я слежу за этим сайтом, так как именно это я и пытаюсь сделать.

У меня настроен веб-сайт, у меня есть код для обработчика в файле .cs, я отредактировал файл web.config, чтобы добавить обработчик для нужного мне расширения файла. Теперь я на шаге 3, где вы рассказываете IIS об этом расширении и сопоставляете его с ASP.NET. Также я использую IIS 7, поэтому интерфейс немного отличается от скриншотов. Это проблема, которую я имею:

1) Go to website
2) Go to handler mappings
3) Go Add Script Map
4) request path - put the extension I want to handle 
5) Executable-  it seems i am told to set aspnet_isapi.dll here. Maybe this is incorrect?
6) Give name
7) Hit OK button:

Добавить карту сценариев

Вы хотите разрешить это расширение ISAPI? Нажмите «Да», чтобы добавить расширение с записью «Разрешено» в список ограничений ISAPI и CGI или обновить существующую запись расширения на «Разрешено» в списке ограничений ISAPI и CGI.

Да Нет Отмена


8) Hit Yes

Добавить карту сценариев

Указанный модуль, требуемый этим обработчиком, отсутствует в списке модулей. Если вы добавляете отображение обработчика карты сценариев, IsapiModule или CgiModule должны быть в списке модулей.

OK


edit 2 : Только что выяснили, что этот управляемый обработчик как-то связан с обработчиками, наблюдаемыми в управляемом коде, сценарий map должен был помочь настроить исполняемый файл и отображение модулей для работы с модулями http. Поэтому я должен использовать опцию 1 - Добавить управляемый обработчик.

Я знаю, каков мой путь запроса для расширения файла ... и я знаю имя (могу называть его как угодно), поэтому это должно быть поле Тип, с которым я борюсь. В папке с приложениями (в IIS) до сих пор у меня просто есть MyHandler.cs и web.config (Конечно, также файл с расширением, для которого я пытаюсь создать обработчик!)

edit3: прогресс

Итак, теперь у меня есть код и настроенный web.config, который я тестирую, чтобы увидеть, могу ли я найти имя файла. Файл CustomExtension:

Ошибка HTTP 404.3 - не найдена Запрашиваемая вами страница не может быть обработана из-за конфигурации расширения. Если страница представляет собой скрипт, добавьте обработчик . Если файл должен быть загружен, добавьте карту MIME.

Итак, в IIS7 я перехожу к отображению обработчиков и добавляю его. См. Этот пример MSDN, это именно то, что я пытаюсь следовать

Класс выглядит так:

using System.Web;

namespace HandlerAttempt2
{
    public class MyHandler : IHttpHandler
    {
        public MyHandler()
        {
            //TODO: Add constructor logic here
        }

        public void ProcessRequest(HttpContext context)
        {
            var objResponse = context.Response;
            objResponse.Write("<html><body><h1>It just worked");
            objResponse.Write("</body></html>");
        }

        public bool IsReusable
        {
            get
            {
                return true;
            }
        }

    }
}

Я добавляю обработчик следующим образом:

Путь запроса: *.whatever Введите: MyHandler (имя класса - это выглядит правильно, как в примере!) Имя: whatever

Попробуйте снова перейти к пользовательскому файлу (он находится в пуле приложений как Integrated ):

HTTP-ошибка 500.21 - внутренняя ошибка сервера У обработчика «что угодно» в списке модулей есть плохой модуль «ManagedPipelineHandler»

Попробуйте снова перейти к пользовательскому файлу (он находится в пуле приложений как CLASSIC ):

HTTP ошибка 404,17 - не найден Запрошенное содержимое выглядит как сценарий и не будет обрабатываться обработчиком статических файлов.

Прямые вопросы

1) Должен ли сайт быть в КЛАССИЧЕСКОМ или ИНТЕГРИРОВАННОМ режиме? Я не нахожу ссылки на это в онлайн-материале, будь то.

2) Должен ли я скомпилировать MyHandler.cs в .dll, или я могу просто оставить его как .cs? Это должно быть в папке bin или просто где-нибудь в корне?

Ответы [ 2 ]

2 голосов
/ 01 июня 2010

RE ваши вопросы:

Я не знаю ответа на первый (КЛАССИЧЕСКИЙ или ИНТЕГРИРОВАННЫЙ); но я могу помочь со вторым ...

Да, вам нужно сначала скомпилировать его. Я никогда не пробовал развертывать dll где-либо, кроме корзины, учитывая, что это стандарт, который я бы заподозрил в размещении их где-либо еще, даже если это сработало.

Способ развертывания HttpHandlers прост и понятен - вся тяжелая работа проделана в web.config, мне всегда приходилось заходить в IIS для изменения любых настроек.

Для начала, для http-запроса, обрабатываемого ASP.NET, необходимо использовать суффикс запроса, который уже передан в ASP.NET, например .aspx или ashx. Если вы хотите использовать что-то еще, вам нужно будет настроить IIS для этого, как указано выше в вашем управляемом обработчике.

Я склонен использовать .ashx Например: http://localhost/foo/my/httphandler/does/this.ashx

Все, что вам нужно сделать (если вы скомпилировали HttpHandler в DLL и развернули его на сайте), это добавить необходимую конфигурацию.

<configuration>
   <system.web>
       <httpHandlers>
            <add verb="*" 
                 path="*.ashx" 
                 type="MyApp.PublishingSystem.HttpHandlers.GroovyHandler, MyApp.PublishingSystem" />
       </httpHandlers>
   </system.web>
</configuration>

Очевидно (?) Вы можете изменить / ограничить область, используя путь, например:

path="*.ashx" 
path="*ListWidgets.ashx" 
path="*Admin/ListWidgets.ashx" 

Подробнее здесь: http://msdn.microsoft.com/en-us/library/ms820032.aspx

Важным моментом, на который стоит обратить внимание, является порядок, в котором вы объявляете свои HttpHandlers в конфигурации; из того, что я помню, те, которые объявлены первыми, принимают прецедент Так что в этом примере ...

<add verb="*"  path="*foo.ashx" type="MyApp.PublishingSystem.HttpHandlers.FooHandler, MyApp.PublishingSystem" />
<add verb="*"  path="*.ashx" type="MyApp.PublishingSystem.HttpHandlers.GroovyHandler, MyApp.PublishingSystem" />

... обработчик groovy будет обрабатывать все HttpRequests , за исключением любого, заканчивающегося foo.ashx

Кстати, я использую HttpHanldrs в моей среде .net CMS / app с открытым исходным кодом, вы можете найти там некоторый полезный код (?): http://morphfolia.codeplex.com/

1 голос
/ 11 сентября 2012

Убедитесь, что версия .NET Framework пула приложений установлена ​​правильно ...

Я развернул веб-приложение .NET 4.0 в пуле приложений .NET 2.0 и получил эту ошибку. Установите для пула приложений v4.X, и пепел служил чемпионом.

...