我有一个看起来像这样的 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/

10-16 17:06