WebAPI BadRequest删除响应数据

问题描述 投票:1回答:2

我有一个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);,但结果是相同的,即数据作为简单的“错误请求”字符串返回。

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

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

angularjs asp.net-web-api
2个回答
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被错误处理程序拦截到某处因此丢失了原始响应数据?

随着我删除的这些处理程序,我使用了Global.asax中的Application_Error处理程序,如by ubik404 here所述。

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


0
投票

你需要删除existingResponse="Replace",我只是有同样的问题,并为我解决了它。默认值为Auto

你的回答让我找到了真正的问题,谢谢! :)

Documentation

© www.soinside.com 2019 - 2024. All rights reserved.