.NET MVC / WEB API 2 - обработка исключений в отладке против выпуска - PullRequest
0 голосов
/ 22 сентября 2019

.NET MVC приложение, которое содержит контроллер Web Api 2.После некоторых поисков в Google я понимаю, что это правильный способ обработки ошибок в контроллере api, создав исключение HttpResponseException с соответствующим кодом состояния:

метод действия контроллера:

[System.Web.Http.Authorize]
public IHttpActionResult GetEntities() {
    var entsDb = db.MyEntities;

    /*
    //uncomment this block to test exception throw
    var response = new HttpResponseMessage(HttpStatusCode.NotFound) {
        Content = new StringContent("some error message", System.Text.Encoding.UTF8, "text/plain"),
        StatusCode = HttpStatusCode.NotFound
    };
    throw new HttpResponseException(response);
    */

    Dictionary<int, string> ents = entsDb.ToDictionary(k => k.id, v => v.name);
    return Ok(ents);
}

Тогдав потребителе я могу поймать исключение и получить доступ к сообщению и т. д. Запрос потребителя:

    using (var client = new HttpClient()) {
        client.BaseAddress = new Uri(BaseAddress);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Add("Authorization", "Bearer " + Token.Access_Token);

        HttpResponseMessage response = await client.GetAsync("Api/GetEntities/");

        if (response.IsSuccessStatusCode) {
            Dictionary<int, string> listEnts = await response.Content.ReadAsAsync<Dictionary<int, string>>();
            return listEnts;
        }
        else {
            var s = response.Content.ReadAsStringAsync();
            s.Wait();
            throw new Exception("An error ocurred. Server response: "+s.Result);
        }
    }

В приведенном выше коде, если я раскомментирую блок исключения (в методе действия контроллера), он работает, как ожидалось, и потребитель получаетисключение и может получить доступ к его сообщению и т. д.

Это нормально работает в процессе разработки, но когда я развертываю проект mvc / webapi на производственном сервере, всякий раз, когда возникает ошибка, вместо получения моего исключения, я просто получаюсообщение «Невозможно отобразить страницу, поскольку произошла внутренняя ошибка сервера»

Я полагаю, это связано с конфигурацией web.Release.config, которая изменяет переключатель «debug» на рабочем сервере, с этой строкой вWeb.Release.config:

<compilation xdt:Transform="RemoveAttributes(debug)"/>

, поэтому с этой конфигурацией, в dev он покажет подробные ошибки, но в производстве он покажет общую ошибку.

, но я не знаю, как ее решить.Есть ли способ заставить его возвращать общие ошибки, когда на рабочем сервере для запросов MVC, но не для запросов WebApi?и, кстати, действительно ли это правильный способ обработки ошибок в WebApi?

** ОБНОВЛЕНИЕ: ** хорошо, по-видимому, мое предположение было неверным.Я повторно развернул его с этой строкой в ​​web.release.config, и он делает то же самое.Кроме того, если я запускаю webapi в localhost, но в режиме релиза, это работает.Так что это просто не работает на сервере.Может быть, какой-то параметр IIS или что-то?

1 Ответ

0 голосов
/ 22 сентября 2019

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

после этого поста Можно ли использовать пользовательские страницы ошибок с сайтом MVC, но не с веб-API?

Вмой web.config Я добавил пользовательские страницы ошибок, такие как:

<httpErrors existingResponse="Replace" defaultResponseMode="ExecuteURL" defaultPath="/Error/Index" errorMode="Custom">
  <remove statusCode="404"/>
  <remove statusCode="400"/>
  <error statusCode="404" responseMode="ExecuteURL" path="/Error/NotFound" />
  <error statusCode="400" responseMode="ExecuteURL" path="/Error/Forbidden" />
</httpErrors>

, а затем у меня был этот блок, чтобы вызовы API игнорировали пользовательские страницы ошибок и возвращали исходную ошибку, как показано здесь

  <location path="Api">
    <system.webServer>
      <validation validateIntegratedModeConfiguration="false" />
      <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough" >
         <clear/>
      </httpErrors>
    </system.webServer>
  </location>

Мне просто нужно было удалить строку <clear/>, и теперь все работает.

...