WebAPI BadRequest删除响应数据

时间:2016-06-23 10:17:24

标签: angularjs asp.net-web-api

我有一个 ASP.NET WebAPI(v2)控制器操作,它具有以下一般结构:

[HttpPost]
public HttpResponseMessage Post(UserDTO model)
{
    try {
        // do something
    }
    catch (Exception ex)
    {
        var error = new {
            errorMessage = ex.Message,
            userId = 123,
            // some other simple data
        };
        return Request.CreateResponse(HttpStatusCode.BadRequest, error);
    } 

    return Request.CreateResponse(HttpStatusCode.OK, model);
}

当我在本地开发服务器( IIS Express )上运行它并且抛出错误时,我得到了预期的JSON有效负载。

{
    config: {...},
    data: {
        errorMessage: "User invalid",
        userId: 123,
        ...
    },
    status: 400,
    statusText: "Bad Request"
}

当我在远程/生产服务器(IIS 8.5)上运行相同的代码/数据时,我得到的全部是:

{
    config: {...},
    data: "Bad Request,
    status: 400,
    statusText: "Bad Request"
}

自定义data有效内容将从响应中丢失/删除。此似乎HttpStatusCode调用中使用的Request.CreateResponse()相关,就好像我将HttpStatusCode.BadRequest更改为HttpStatusCode.OK,然后下载了自定义数据有效负载

在我测试时,我尝试将返回值更改为Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);,但结果是相同的,即数据是作为简单的"错误请求" 字符串返回的

作为参考,AngularJS $http.post()调用正在调用API。

为什么HttpStatusCode中的更改会更改生产服务器上的响应有效负载而不是本地?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

事实证明这是Web.config中的以下部分

<system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
        <remove statusCode="403" />
        <error statusCode="403" responseMode="ExecuteURL"
               path="/Error/AccessDenied" />
        <remove statusCode="404" />
        <error statusCode="404" responseMode="ExecuteURL"
               path="/Error/NotFound" />
        <remove statusCode="500" />
        <error statusCode="500" responseMode="ExecuteURL"
               path="/Error/ApplicationError" />
    </httpErrors>
</system.webServer>

这是'奇怪的',因为这些页面没有被API调用返回,但是删除后,API调用返回了正确的有效负载 - 可能是HttpStatusCode.BadRequest被错误处理程序拦截到某处,从而失去了原始回复数据?

通过删除这些处理程序,我按照by ubik404 here所述使用 Global.asax 中的Application_Error处理程序。

可能有更好/替代的方法来实现相同的结果,但这似乎有效。

答案 1 :(得分:0)

您需要删除existingResponse="Replace",但我遇到了同样的问题,这为我解决了。默认值为Auto

您的回答使我找到了真正的问题,非常感谢! :)

Documentation