{«Сообщение» WebApi: «произошла ошибка»} в IIS7, а не в IIS Express


171

Я работаю с ASP.NET MVC 4 WebApi и мне очень нравится запускать его на моем локальном компьютере в IIS Express. Я также настроил IIS Express для обслуживания удаленных компьютеров, поэтому другие сотрудники моей компании используют мой компьютер в качестве нашего веб-сервера.

После того, как мы решили, что это решение не является оптимальным, мы решили разместить WebApi на удаленном сервере после установки .NET 4.5. Когда я использую fiddler и отправляю POST на контроллер на моем локальном компьютере, он возвращает правильный ответ, но когда я меняю домен на веб-сервер под управлением IIS7, тот же POST возвращает загадочный

{"message": "произошла ошибка"}

сообщение. У кого-нибудь есть идеи, что может происходить?


2
Что такое код состояния HTTP в ответе об ошибке? Если он равен 500, то весьма вероятно, что конфигурация веб-сайта / приложения недопустима для удаленного компьютера с IIS 7. Создайте простой файл HTML на удаленном компьютере, просмотрите его на удаленном компьютере, если это возможно, чтобы убедиться, что его можно просмотреть, а затем попробуйте ударить его с вашей машины, чтобы увидеть, если он успешен или нет.
Сиксто Саез

Это 500-ошибка. Спасибо за предложение, но страница index.html по умолчанию, предоставляемая WebApi, работает. Также следует добавить, что некоторые из веб-сервисов API работают, а другие нет, тогда как все они работают на моей локальной машине.
Nsg

2
Вам нужно включить трассировку запросов IIS, чтобы получить больше подробностей, когда вы видите ошибку 500. Ошибка 500 обычно возникает до того, как начинается маршрутизация Web API, но я предполагаю, что ее можно инициировать тем, что делает ваш код. Посмотрите на журнал трассировки IIS и посмотрите, предлагает ли это какие-либо подсказки.
Sixto Saez

1
Возможно, вы сможете получить от сервера больше подробных сведений об ошибках в своем ответе, инициировав запрос из браузера на самой машине сервера (например, используя сеанс удаленного рабочего стола).
Джон Шнайдер

Ответы:


268

Проблема заключалась в отсутствующей зависимости, которая отсутствовала на сервере, но была на моей локальной машине. В нашем случае это была библиотека Devart.Data.Linq.

Чтобы получить такой ответ, я включил трассировку IIS для 500 ошибок. Это дало немного информации, но действительно полезно было установить в web.config параметр <system.web><customErrors mode="Off"/></system.web>This, указывающий на отсутствующую динамически загружаемую зависимость. После добавления этой зависимости и указания на ее локальное копирование сервер начал работать.


33
Похоже, что WebAPI заменит {"message": "произошла ошибка"} для реального ответа всякий раз, когда код ответа HTTP равен 500 и включены пользовательские ошибки. Спасибо за указатель.
Пол Суарт

4
Отличное предложение по настройке режима customErrors. Я удивлен изменением, которое повлияло на вывод ошибок такого рода.
Деви Рис

1
Вы также можете установить его, mode="RemoteOnly"и если вы запустите страницу в веб-
браузере

Какие-либо предложения о том, как получить такого рода сведения об ошибках при изменении этого параметра, невозможны (например, ошибки отключены на уровне компьютера, поскольку часть API размещена на PCI-совместимом сервере)? Я попытался настроить Elmah, но, к сожалению, ничего не записывается.
RubyHaus

Это лучший подход, дает достаточно информации о таком общем методе.
DanielV 19.09.16

97

В принципе:

IncludeErrorDetailPolicyВместо этого используйте, если CustomErrorsэто не решает для вас (например, если вы используете ASP.NET> 2012):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

Примечание. Будьте внимательны, возвращая подробную информацию об ошибке, которая может раскрыть конфиденциальную информацию хакерам. См. Комментарий Саймона к этому ответу ниже.

TL; DR версия

Для меня CustomErrorsэто не очень помогло. Это было уже установлено Off, но я все еще получил только жалкое an error has occurredсообщение. Я предполагаю, что принятый ответ от 3 лет назад, который является долгое время в веб-слове в настоящее время. Я использую Web API 2 и ASP.NET 5 (MVC 5), и Microsoft отошла от стратегии, CustomErrorsоснованной только на IIS, в то время как старый skool IIS;).

В любом случае, у меня была проблема с производством, которой у меня не было на месте. А потом обнаружил, что не вижу ошибок на вкладке «Сеть» Chrome, как на своей машине разработчика. В конце концов мне удалось решить эту проблему, установив Chrome на свой производственный сервер и затем перейдя к приложению на самом сервере (например, на «localhost»). Потом появились более подробные ошибки со следами стека и все.

Только после этого я нашел эту статью от Джимми Богарда (Примечание: Джимми - мистер AutoMapper! ). Самое смешное, что его статья также написана в 2012 году, но в ней он уже объясняет, что CustomErrorsэто больше не помогает, но что вы МОЖЕТЕ изменить « IncludeErrorDetailPolicyСведения об ошибках», установив другое в глобальной конфигурации WebApi (например WebApiConfig.cs):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

К счастью, он также объясняет, как настроить, чтобы webapi (2) слушал ваши CustomErrorsнастройки. Это довольно разумный подход, и это позволяет вам вернуться к 2012 году: P.

Примечание. Значение по умолчанию - «LocalOnly», что объясняет, почему я смог решить проблему так, как я описал, до нахождения этого поста. Но я понимаю, что не все могут просто подключиться к производству и запустить браузер (я знаю, что в основном не мог, пока не решил заняться фрилансом и DevOps).


2
Теперь это работает. Спасибо! У меня есть некоторые тесты типа in-memory-Integration-Owin, которые не на сервере сборки, но не локально. С этим параметром в моем стартап-классе у меня может быть шанс выяснить, почему.
Томас Эйд

Похоже, что параметр customError работает с WebApi 2 при размещении в IIS через Microsoft.AspNet.WebApi.WebHost. Пакеты версии 5.2.3, поэтому стек ASP.NET был выпущен после 2012 года. Если для этого параметра установлено значение Выкл., Веб-интерфейс API переключается с общих ошибок на более подробные, содержащие стек вызовов и т. Д.
Том

4
Будьте осторожны при настройке этого, потому что это может раскрыть конфиденциальную информацию для «хакеров». Я часто делаю быстрый взлом чего-то вроде if (DateTime.Now < new DateTime(2017, 6, 22)) { .... }установки опции, подобной этой. Затем я могу протестировать его на производстве, и завтра он волшебным образом вернется к нормальному поведению, если я забуду его отключить.
Simon_Weaver

36

Ни один из других ответов не работал для меня.

Это сделал: (в Startup.cs)

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();

        WebApiConfig.Register(config);

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}

(или вы можете поместить его в WebApiConfig.cs):

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}

Да! Это было единственное рабочее решение для меня на Mono / Linux.
Роберт II

У меня это работало на prod для приложения с внутренним обслуживанием на IIS и Windows Server.
Пол Карлтон

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; помог мне найти, что я возвращаю экземпляр сущности, которая не может быть проанализирована, потому что контекст был удален, спасибо
Jood jindy

12

Я всегда прихожу к этому вопросу, когда сталкиваюсь с ошибкой в ​​тестовой среде и вспоминаю: «Я делал это раньше, но я могу сделать это прямо в web.config без необходимости изменять код и повторно развертывать в тестовой среде. , но требуется 2 изменения ... что это было снова? "

Для дальнейшего использования

<system.web>
   <customErrors mode="Off"></customErrors>
</system.web>

И

<system.webServer>
  <httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>

11

У меня была похожая проблема при публикации в конечной точке WebAPI. Повернув CustomErrors = Off, я смог увидеть фактическую ошибку, которая отсутствовала в одной из библиотек.


10

На случай, если это кому-нибудь поможет:

У меня была похожая проблема, и я добавил следующие инструкции Нейтса:

<system.web>
     <customErrors mode="Off"/>
 </system.web>

Это показало мне больше информации об ошибке:

«ExceptionMessage»: «Невозможно загрузить указанный ресурс метаданных.», «ExceptionType»: «System.Data.Entity.Ceta.MetadataException», «StackTrace»: «at System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeRo .LoadResources (...

В этот момент я вспомнил, что переместил файл edmx в другое место и забыл изменить узел строк соединений в конфигурации (узел соединений был помещен в отдельный файл с использованием «configSource», но это уже другая история).


Это произошло со мной при добавлении OData и AutoMapper в веб-API в asp.net - надеюсь, эти ключевые слова помогут кому-то дойти до этого поста, и попытка / отлов не работала в моем случае, поэтому мне пришлось увидеть исходный результат
Ekus,

0

Мой файл swagger XML не был развернут в \ bin:

GlobalConfiguration.Configuration
  .EnableSwagger(c =>
  {
    c.SingleApiVersion("v1", "SwaggerDemoApi");
    c.IncludeXmlComments(string.Format(@"{0}\bin\SwaggerDemoApi.XML", 
                         System.AppDomain.CurrentDomain.BaseDirectory));
    c.DescribeAllEnumsAsStrings();
  })

http://wmpratt.com/swagger-and-asp-net-web-api-part-1/

введите описание изображения здесь

Это должно быть установлено в Конфигурации выпуска, а также в Конфигурации отладки.


0

Если <deployment retail="true"/>в вашем компьютере .NET Framework есть файл machine.config, вы не увидите подробных сообщений об ошибках. Убедитесь, что параметр имеет значение false или отсутствует.


0

Поэтому я попробовал все предложенные решения безрезультатно. Все, что я сделал, это установил запуск приложения с сервера, и он отображал ошибку полностью, это должно было сработать, когда я установил режим customErrors в false, но это не так. В тот момент, когда я просматривал API-интерфейс сервера, я смог увидеть проблему.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.