使用asp.net Web API 2属性路由创建可以在URI中接受DateTime的路由

Dim*_*kov 3 asp.net-web-api asp.net-web-api-routing

我正在尝试查看是否需要编写一个自定义,IHttpRouteConstraint或者是否可以与内置的内容搏斗以获取所需的内容。我看不到任何关于此的好的文档。

基本上,这是我的操作:

[Route("var/{varId:int:min(1)}/slot/{*slot:datetime}")]
public async Task<HttpResponseMessage> Put(int varId, DateTime slot)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想要的是能够这样称呼它: PUT /api/data/var/1/slot/2012/01/01/131516并让框架将19绑定到var id和DateTime一个值为“ slot”的值“ aJan 1st,2012,1:15:16 pm”。

按照此处的指南进行操作:http : //www.asp.net/web-api/overview/web-api-routing-and-actions/create-a-rest-api-with-attribute-routing我能够它只能通过传递日期段(即PUT /api/data/var/1/slot/2012/01/01或)来工作PUT /api/data/var/1/slot/2012-01-01,但这只给我一个数据值,没有时间成分。

有人告诉我,尝试以任何合理的方式在URI段中传递时间是一个坏主意,但是我不确定为什么这会是个坏主意,除了在本地时间与UTC时间上存在歧义。

我也尝试过datetime使用正则表达式{slot:datetime:regex(\\d{4}/\\d{2}/\\d{2})/\\d{4})}来约束约束,例如试图使其解析2013/01/01/151617为诸如DateTime之类的东西,但无济于事。

我很确定我可以将其与自定义一起使用IHttpRouteConstraint,我只是不想做可能内置的事情。

谢谢!

小智 6

一种选择是将DateTime作为查询字符串参数传递(请参见[FromUri]

例如

[Route("api/Customer/{customerId}/Calls/")]
public List<CallDto> GetCalls(int customerId, [FromUri]DateTime start, [FromUri]DateTime end)
Run Code Online (Sandbox Code Playgroud)

这将有一个签名

GET api/Customer/{customerId}/Calls?start={start}&end={end}
Run Code Online (Sandbox Code Playgroud)

使用创建查询字符串日期

startDate.ToString("s", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

查询字符串看起来像

api/Customer/81/Calls?start=2014-07-25T00:00:00&end=2014-07-26T00:00:00
Run Code Online (Sandbox Code Playgroud)