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