【发布时间】:2014-05-11 19:11:12
【问题描述】:
我想处理以下 API-Call 的 POST:
/v1/location/deviceid/appid
附加参数来自 Post-Body。
这一切对我来说都很好。现在我想通过允许“deviceid”和/或“appid”和/或 BodyData 为空来扩展我的代码:
/v1/location/deviceid
/v1/location/appid
/v1/location/
这 3 个 URL 应该由相同的路由响应。
我的第一种方法(需要 BodyData):
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody] location_fromuser BodyData)
{
return repository.AddNewLocation(deviceid, appid, BodyData);
}
这不起作用并返回编译错误:
"可选参数必须在末尾"
下一次尝试:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)
现在我的函数 AddNewLocation() 总是得到一个 BodyData=null - 即使调用发送正文。
最后我将所有 3 参数设置为可选:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)
不工作:
FormatterParameterBinding不支持可选参数BodyData。
为什么我需要带有可选参数的解决方案?我的控制器仅通过 POST 处理“添加新位置”。
我想发送我自己的异常或错误消息的错误数据。即使调用有缺失值。在这种情况下,我希望能够决定通过我的代码抛出异常或设置默认值。
【问题讨论】:
标签: c# asp.net asp.net-web-api asp.net-web-api-routing