【发布时间】:2013-06-10 23:09:38
【问题描述】:
比如有一个Web Api action方法:
public HttpMessageResponse Post(UserDto userDto)
{
if (!this.ModelState.IsValid)
{
return this.Request.CreateErrorResponse(
HttpStatusCode.BadRequest, this.ModelState);
}
// ...
}
客户端发送以下请求:
HTTP POST: /api/user
{ "username": "me", "password": "Pa$sw0rd" }
并得到响应:
HTTP 201/Created:
{ "message": "Your request is invalid.",
"modelState": { "userDto.Password": "Your password is too strong." } }
默认情况下,action 方法通过在模型错误前面加上 action 方法中使用的参数名称来公开实现细节。如果客户端应用程序在清理模型错误时硬编码此前缀名称,然后服务器端代码更改(例如,您将 Post(UserDto userDto) 签名替换为 Post(UserDto dto))并且所有客户端应用程序停止工作,该怎么办。
这就是为什么您需要确保在服务器端删除此前缀。问题是,如何正确地做到这一点,而不会使事情复杂化。例如,您可以创建自定义序列化程序并在序列化期间删除这些前缀。但为了这样做,您需要知道模型参数的名称,调用代码可能如下所示:
public HttpMessageResponse Post(UserDto userDto)
{
if (!this.ModelState.IsValid)
{
return this.Request.CreateCustomErrorResponse(
HttpStatusCode.BadRequest, this.ModelState, modelName: "userDto");
}
// ...
}
【问题讨论】:
标签: .net asp.net-web-api