Исключение исключений в ASP.NET в результате файла Generic Handler (ashx)

Я пытаюсь получить другой стек на стороне сервера, работающий с моим сайтом ASP.NET. Мой файл ashx, кажется, бросает 500 Internal Server Error. Как я могу выяснить, какое исключение выбрал этот файл ashx или причина, по которой выбрасывается 500? Когда я присоединяюсь к своему процессу w3wp.exe IIS 7, он не генерирует исключение, но я читаю, что это, вероятно, так.

Файл ashx находится в корневой директории моего сайта ASP.NET, и свойства, которые он задал для компиляции.

GET http://uhc-8:8883/MyApp/ExtDirectProxy.ashx 500 (Internal Server Error) index.html:27
Uncaught TypeError: Cannot read property 'isProvider' of null ext-all-debug.js:74832
allow right click initializing for http://uhc-8:8883/MyApp/index.html rightclick.js:1
allow right click processing http://uhc-8:8883/MyApp/index.html rightclick.js:25

Ответ 1

Если у вас есть папка под названием "App_Code", вы можете пройти через головные боли и мигранты. Или просто замените "App_Code" на случайное имя, например "код" или "данные" и поместите свои классы туда, чтобы исправить это. В моем case, мой GUID проекта был веб-приложением и типом С#.

Лучший ответ:

Проблемы с папкой App_Code

Примечание:

Я запускаю сайт с помощью IIS со статическим портом, не используя Visual Studio 2012 с динамическим портом. У меня определенная конфигурация сервера на веб-сервере, поэтому я хочу, чтобы сайт вел себя так же, как работает наш выпущенный сайт. Поэтому, почему я запускаю это так.

Отвечайте на мой вопрос:

Это произошло потому, что у нас были дублированные версии классов App_Data в папке bin. "Компилировать" версию *.cs и версию веб-сайта *.cs. Ошибка isProvider возникает, когда существует более одного класса с тем же именем. Когда мы развертываем приложение ASP.NET, мы развертываем ТОЛЬКО скомпилированную версию файлов *.cs. В среде разработки мы сохраняем для них значение "Свойства" > "Создать действие" > "Нет".

Не уверен в этом. Возможно, это связано с тем, что вы делаете во временной и/или obj-папке, но точно не уверены. Подумайте о том, почему. В то же время, вот список вещей для решения проблемы. Не уверен, нужны ли некоторые или все из них, но теперь он работает.

Шаги для исправления:

  • измените все файлы App_Data *.cs на Properties > Build Action > Compile
  • Исправить исключения, которые они выбрали, чтобы снова запустить эту сборку - Clean Solution > Build Solution... одно исключение не было обнаружено с помощью тех, которые были установлены в свойствах > Build Action > None, поэтому почему это было необходимо. По сути, Visual Studio 2012 не генерирует исключение и говорит "Build Successful".
  • затем измените файлы App_Data *.cs обратно в Properties > Build Action > None
  • удалить dll из \obj\Debug
  • удалить dll из \bin
  • удалить временные файлы ASP.NET - C:\WINDOWS\Microsoft.NET\Framework\{.NET version}\Temporary ASP.NET Files\
  • Решение для сборки
  • перезапустить веб-сайт IIS

Теперь все отлично работает!

EDIT:

Фактическая проблема заключалась в том, что я ссылался на внешний проект в Visual Studio, но для него не было dll файла, потому что тип проекта был консольным приложением, а не библиотекой классов. Реальная проблема заключалась в том, что Visual Studio говорит, что она компилирует код в порядке (в App_Code), когда у вас есть инструкция using к этому другому проекту, но говорит, что успешно построена, даже если для всех *.cs файлов установлена ​​опция Build Action > Compile App_Code. Когда вы запустите веб-приложение, оно должно быть возвращено в действие "Действие" > "Нет" для его работы. Однако, поскольку файлы *.cs в App_Code фактически не компилируются с новым кодом (если это так, как ASP.NET в IIS обрабатывает эти файлы App_Code *.cs), он выдает ошибку 500 Internal Server, потому что нет хорошего кода CIL во время выполнения. Чтобы решить эту проблему, я просто изменил тип проекта на библиотеку классов, и он по-прежнему не имеет ошибок, но теперь он может ссылаться на dll на другой проект.

Ошибка isProvider всегда возникает при обнаружении дублированных классов. Поэтому я не уверен, почему это происходит, но это по существу уходит, как только вы исправляете часть выше.

Ответ 2

Вы можете использовать событие Application_Error в файле Global.asax, чтобы поймать эту ошибку.

protected void Application_Error(Object sender, EventArgs e)
{
    HttpContext ctx = HttpContext.Current;
    Exception exception = ctx.Server.GetLastError();
    int httpCode = ((HttpException)exception).GetHttpCode(); // check if it is 500
}