Не удается вернуть пользовательские подробности об ошибке HTTP удаленно - PullRequest
16 голосов
/ 01 декабря 2011

Это странно. Я использую MVC 3 и получаю результат пользовательского действия, который переносит исключения и возвращает сообщение вместе со стандартной ошибкой HTTP.

public class ExceptionResult : ActionResult
{
    private readonly Exception _exception;

    public ExceptionResult(Exception exception)
    {
        _exception = exception;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.ClearHeaders();
        response.Cache.SetNoStore();
        response.ContentType = ContentType.Json;

        var baseEx = _exception as BaseException ?? new ServerException(_exception);

        var result = baseEx.GetResult();

        var json = result.ToJSON();
        response.Write(json);
        response.StatusCode = (int)result.Status.Code;
    }
}

Когда я запускаю это локально, я получаю именно то, что ожидаю:

HTTP/1.1 400 Bad Request
Cache-Control: no-store
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
Date: Thu, 01 Dec 2011 19:00:03 GMT
Content-Length: 81

{"error":"invalid_request","error_description":"Parameter grant_type is missing"}

Но когда я пытаюсь подключиться с другого компьютера, вместо этого появляется стандартное сообщение об ошибке IIS:

HTTP/1.1 400 Bad Request
Cache-Control: no-store
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
Date: Thu, 01 Dec 2011 19:02:33 GMT
Content-Length: 11

Bad Request

UPDATE

Где-то в конвейере IIS должен быть какой-то модуль http, который проглатывает ответ и переписывает содержимое. Я написал модуль для регистрации запроса и ответа, и он возвращает именно то, что я ожидаю, однако то, что на самом деле делает его браузером, неверно.

2011-12-02 15:39:00,518 - ======== Request ========
2011-12-02 15:39:00,518 - GET /oauth/2/token HTTP/1.1
2011-12-02 15:39:00,519 - Cache-Control: max-age=0
2011-12-02 15:39:00,519 - Connection: keep-alive
2011-12-02 15:39:00,519 - Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
2011-12-02 15:39:00,519 - Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
2011-12-02 15:39:00,519 - Accept-Encoding: gzip,deflate,sdch
2011-12-02 15:39:00,519 - Accept-Language: en-US,en;q=0.8
2011-12-02 15:39:00,519 - Host: micah-pc:8095
2011-12-02 15:39:00,519 - User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2
2011-12-02 15:39:00,519 - =========================
2011-12-02 15:39:00,519 - OAuth exception occurred.
BoomTown.OAuth.OAuthException: Parameter grant_type is missing
   at BoomTown.OAuth.Request.TokenRequest.GetRequestValidator() in C:\code\BoomTown\Api\BoomTown.OAuth\Request\TokenRequest.cs:line 19
   at BoomTown.OAuth.Request.OAuthRequestBase.Validate() in C:\code\BoomTown\Api\BoomTown.OAuth\Request\OAuthRequestBase.cs:line 33
   at BoomTown.OAuth.Request.OAuthRequestBase..ctor(HttpRequestBase request, IOAuthServiceLocator serviceLocator) in C:\code\BoomTown\Api\BoomTown.OAuth\Request\OAuthRequestBase.cs:line 28
   at BoomTown.OAuth.Request.TokenRequest..ctor(HttpRequestBase request, IOAuthServiceLocator serviceLocator) in C:\code\BoomTown\Api\BoomTown.OAuth\Request\TokenRequest.cs:line 13
   at BoomTown.Api.Web.Controllers.OAuth.V2.OAuthController.Token() in C:\code\BoomTown\Api\BoomTown.Api.Web\Controllers\OAuth\V2\OAuthController.cs:line 26
2011-12-02 15:39:00,520 - ======= Response =======
2011-12-02 15:39:00,520 - HTTP/1.1 400 Bad Request
2011-12-02 15:39:00,520 - Cache-Control: no-store
2011-12-02 15:39:00,520 - X-AspNet-Version: 4.0.30319
2011-12-02 15:39:00,520 - Content-Type: application/json; charset=utf-8
2011-12-02 15:39:00,520 - {"error":"invalid_request","error_description":"Parameter grant_type is missing"}

РЕШЕНИЕ

Благодаря небольшому подлому я смог понять это. Я настроил трассировку IIS, которая подтвердила мои подозрения, что это было связано с customerrormodule , который перехватывал мои запросы и перезаписывал мои сообщения об ошибках. Я продолжал обезьянить с

<system.web>
  <customErrors />
<system.web>

настроек, но безрезультатно. Я был на правильном пути, но поскольку я работаю с IIS 7, мне нужно было изменить правильный раздел web.config следующим образом:

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

Теперь все мои пользовательские сообщения JSON проходят без проблем. Большое спасибо Джейсону Финнифроку за команду тегов на этом.

Ответы [ 2 ]

9 голосов
/ 03 декабря 2011

В вашем файле web.config есть ли у вас httpErrors, определяемые только как DetailsLocalOnly?Я не уверен, будет ли удален контент в этой ситуации.

http://www.iis.net/ConfigReference/system.webServer/httpErrors

3 голосов
/ 01 декабря 2011

Я сталкивался с этим, не уверен, поможет ли это:

context.HttpContext.Response.TrySkipIisCustomErrors = true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...