Я столкнулся с неприятной проблемой, которая, как мне кажется, вызвана IIS 8.5. В создаваемом мной веб-приложении я создал собственный класс JSON HttpStatusResult (идея из этой статьи ), которая позволяет мне возвращать JSON вместе с 500, 400 или другие типы кодов состояния ответа HTTP. Вот этот код:
public class JsonHttpStatusResult : JsonResult
{
private readonly HttpStatusCode _httpStatus;
public JsonHttpStatusResult(object data, HttpStatusCode httpStatus)
{
Data = data;
_httpStatus = httpStatus;
}
public override void ExecuteResult(ControllerContext context)
{
context.RequestContext.HttpContext.Response.StatusCode = (int)_httpStatus;
JsonRequestBehavior = JsonRequestBehavior.AllowGet;
base.ExecuteResult(context);
}
}
При локальном тестировании с использованием IIS Express это работает так, как я ожидал - если я верну код состояния 500 Http вместе с некоторым JSON, ответ будет содержать просто JSON. Однако, когда я публикую sh сайт на веб-сервере IIS 8.5, который у нас есть (к сожалению, у нас еще нет работающего IIS 10 - я не думаю, что это будет иметь значение?), Он вместо этого возвращает значение по умолчанию Страница ответа с ошибкой 500, а не JSON:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>500 - Internal server error.</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;}
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;}
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;}
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}
-->
</style>
</head>
<body>
<div id="header"><h1>Server Error</h1></div>
<div id="content">
<div class="content-container"><fieldset>
<h2>500 - Internal server error.</h2>
<h3>There is a problem with the resource you are looking for, and it cannot be displayed.</h3>
</fieldset></div>
</div>
</body>
</html>
Итак, это то, на чем я застрял - как мне заставить IIS возвращать мой собственный результат ошибки 500 JSON вместо этого по умолчанию 500 страниц? Я осмотрелся и увидел несколько сообщений, в которых упоминалось, что это две важные строки кода, которые необходимы:
HttpContext.Response.Clear();
HttpContext.Response.TrySkipIisCustomErrors = true;
Однако я не знаю, как установить их при отправке своего собственного ответа об ошибке , как только я возвращаю ответ об ошибке JSON, как в этом примере:
return new JsonHttpStatusResult(new
{
ResponseMessage = ex.Message
},
HttpStatusCode.InternalServerError);
Тогда я не могу установить ответ, поскольку после вызова возврата больше не запускается код? Есть ли какой-то способ, которым я могу подключиться к ответу после того, как мой пользовательский класс результатов Json создал ответ, я видел что-то вроде этого с этим сообщением , но, к сожалению, это не похоже объясните, как я должен это использовать?
Стоит упомянуть, что причина, по которой я пытаюсь вернуть JSON ответов об ошибках, заключается в том, что эти действия вызываются Ajax из внешнего интерфейса, а затем эти ошибки обрабатываются / отображаются javascript во внешнем интерфейсе, поэтому я пытаюсь передать больше, чем просто сообщение «500 внутренних ошибок сервера».