我有一个看起来像这样的 WebAPI 操作:
[Route("api/values/{id}")]
public async Task<HttpResponseMessage> Delete(string id, DateTimeOffset date) {
//do stuff
}
但是当我从一个
HttpClient
实例调用它时,创建一个像这样的 URL:string.Format("http://localhost:1234/api/values/1?date={0}", System.Net.WebUtility.UrlEncode(DateTimeOffset.Now.ToString()));
// -> "http://localhost:1234/api/values/1?date=17%2F02%2F2015+7%3A18%3A39+AM+%2B11%3A00"
我收到一个
400
响应,说不可为空的参数 date
不存在。我还尝试将
[FromUri]
属性添加到参数中,但它仍然没有映射通过。如果我将它更改为 DateTimeOffset?
,我可以看到它被保留为空,并且查看 Request.RequestUri.Query
的值在那里,只是没有映射。最后我尝试不做
WebUtility.UrlEncode
并且没有什么不同。 最佳答案
400 响应消息准确地描述了这个问题,尽管它本来可以更清楚。由属性定义的路由只需要一个参数 id ,但 Delete 方法需要另一个参数 日期 0x251819211234。
如果要使用查询字符串提供此值,则需要通过使用“DateTimeOffset?”使该参数可以为空,这也会将其转换为可选参数。如果日期是必填字段,请考虑将其添加到路由中,例如:[Route("api/values/{id}/{date}")]
好的,忽略我上面输入的内容,这只是格式问题。 Web API 无法确定解析给定值所需的区域性,但如果您尝试在查询字符串中使用 JSON 格式传递 DateTimeOffset,例如 2014-05-06T22:24:55Z,那应该可行。
关于c# - 将 DateTimeOffset 作为 Web API 查询字符串传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28549737/