#c# #asp.net #.net #handler #httphandler
#c# #asp.net #.net #обработчик #httphandler
Вопрос:
Что меня заинтересовало, так это то, что универсальный обработчик отлично работает, когда я запускаю веб-приложение в Visual Studio ASP.NET Сервер разработки. Когда я меняю конфигурацию, чтобы запускать ее непосредственно из IIS, обработчик просто умирает.
Это обработчик изображений, он записывает обратно массив байтов для отображения в объекте изображения. Как я уже сказал, он отлично работает на сервере разработки VS, но не работает на IIS. Он даже не вызывается…
Ошибка, которую я получаю, когда пытаюсь вызвать ее напрямую, заключается в следующем:
Описание ошибки синтаксического анализатора: ошибка произошла во время синтаксического анализа ресурса, необходимого для обслуживания этого запроса. Пожалуйста, ознакомьтесь со следующими подробными сведениями об ошибке синтаксического анализа и соответствующим образом измените исходный файл. Сообщение об ошибке синтаксического анализатора: не удалось создать тип ‘YourImageHandler’. Ошибка источника: строка 1: <%@ WebHandler Language=»C #» CodeBehind=»YourImagehandler.ashx.cs» Class=»YourImageHandler» %>
Обработчик в web.config:
<system.web>
<httpHandlers>
<add verb="*" path="*.ashx" type="YourImageHandler"/>
</httpHandlers>
</system.web>
Универсальный обработчик находится в той же сборке веб-проекта, и все это выполняется на IIS 7.
Комментарии:
1. В какой сборке находится ваш обработчик? И отличается ли эта сборка от asp.net сам веб-проект?
2. Как ваш обработчик отображается в web.config? Это внутри <system.web amp; > или внутри < system.webServer >? Какую вер сию IIS вы используете?
3. @KirkWoll ответил на вопрос.
4. @VoidMain ответил на вопрос.
5. проверьте пул приложений . сетевая версия вашего веб-сайта совпадает с версией вашего веб-проекта .net или нет
Ответ №1:
Если вы используете IIS 7 в режиме конвейера, то определение обработчика должно быть в <System.webServer> следующим образом:
<system.webServer>
<handlers>
<add name="YourImageHandlerName" path="*.ashx" verb="*" type="YourImageHandler" />
</handlers>
</system.webServer>
Проверьте здесь: http://blogs.msdn.com/b/tmarq/archive/2007/08/30/iis-7-0-asp-net-pipelines-modules-handlers-and-preconditions.aspx
IIS 7.0 имеет два режима конвейера: интегрированный и классический. Последний иногда называют режимом ISAPI.
Интегрированный режим позволяет как управляемым, так и собственным модулям регистрироваться для событий в конвейере IIS. Это позволяет использовать множество новых сценариев, таких как применение ASP.NET формирует аутентификацию для non-asp.net запросы (статические файлы, классические ASP-файлы и т.д.).
Классический режим идентичен IIS 6.0. В классическом режиме ASP.NET конвейер (BeginRequest, AuthenticateRequest,…, EndRequest) полностью выполняется в событии EXECUTE_REQUEST_HANDLER конвейера IIS. Подумайте о ASP.NET в классическом режиме как конвейер внутри конвейера.
Другой вариант — запустить ваш сайт в «классическом» режиме, в классическом режиме IIS 7 работает как IIS 6 и имеет то же поведение (что здесь важно), что и ваш веб-сервер Cassini.
Надеюсь, это поможет.
Комментарии:
1. Я протестирую это завтра. Тогда почему это сработало при запуске приложения на сервере разработки?
2. Он работает на вашем сервере разработки (я предполагаю, что вы говорите о версии Cassini, которая поставляется с VS), потому что он использует синтаксис IIS6.
Ответ №2:
Вы должны добавить атрибут предварительного условия в файл web.config
<add name="HandlerName" verb="*" path="Handlers/HandlerName.ashx" type="Namespace/HandlerClassName, MyAssembly, Version=1.0.*, Culture=neutral" preCondition="classicMode,runtimeVersionv4.6.1"/>
Теперь он работает для моей ошибки.
Ответ №3:
Я думаю, вам следует добавить управляемое сопоставление обработчиков в IIS. недостаточно добавить конфигурацию. Вы можете посмотреть здесь .