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

时间:2013-10-30 19:48:00

标签: 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)
{
    ...
}

我想要的是能够像这样调用它: PUT /api/data/var/1/slot/2012/01/01/131516并将框架绑定19到var id和DateTime,其值为“Jan 1st,2012,1:15:16 pm”作为“slot”值。

按照此处的指南进行操作: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/01PUT /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之类的日期时间,但无济于事。

我很确定我可以使用自定义IHttpRouteConstraint进行此操作,我只是不想做可能内置的操作。

谢谢!

2 个答案:

答案 0 :(得分:3)

Web API日期时间约束在解析日期时间方面没有做任何特别的事情,您可以在下面看到(源代码here)。 如果您的请求网址类似于var/1/slot/2012-01-01 1:45:30 PMvar/1/slot/2012/01/01 1:45:30 PM,那么它似乎工作正常......但我想如果您需要充分的灵活性,那么创建自定义约束是最佳选择...

public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
{
    if (parameterName == null)
    {
        throw Error.ArgumentNull("parameterName");
    }

    if (values == null)
    {
        throw Error.ArgumentNull("values");
    }

    object value;
    if (values.TryGetValue(parameterName, out value) && value != null)
    {
        if (value is DateTime)
        {
            return true;
        }

        DateTime result;
        string valueString = Convert.ToString(value, CultureInfo.InvariantCulture);
        return DateTime.TryParse(valueString, CultureInfo.InvariantCulture, DateTimeStyles.None, out result);
    }
    return false;
}

答案 1 :(得分:3)

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

e.g。

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

这将有

的签名
GET api/Customer/{customerId}/Calls?start={start}&end={end}

使用

创建查询字符串日期
startDate.ToString("s", CultureInfo.InvariantCulture);

查询字符串看起来像

api/Customer/81/Calls?start=2014-07-25T00:00:00&end=2014-07-26T00:00:00