WebAPI BadRequest删除响应数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebAPI BadRequest删除响应数据相关的知识,希望对你有一定的参考价值。

我有一个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的更改会改变生产服务器上的响应有效负载而不是本地?任何帮助将非常感激。

答案

事实证明这是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所述。

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

另一答案

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

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

Documentation

以上是关于WebAPI BadRequest删除响应数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 WEB API 请求和响应 XML 中删除命名空间?

ASP.NET Web Api HttpResponseException 400 (Bad Request) 被 IIS 劫持

从 web api 响应中删除 $id

从 ASP.NET MVC 项目调用 .NET CORE 5 Web API 微服务时无法检索 BadRequest 错误

asp net core 3 在发布后获取带有正文内容的 POST 操作的 BadRequest 响应

Web api dotnet core 中的 Api 版本控制错误的自定义错误响应