我有一个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所述。
可能有更好/替代的方法来实现相同的结果,但这似乎有效。