使用datetime参数时不支持http get方法

时间:2017-05-30 20:24:13

标签: asp.net-mvc asp.net-web-api asp.net-web-api2

我有Webapi服务控制器,它支持两个按参数区分的get方法

控制器

UNTIL

配置

public class DailyRecordController : BaseApiController
{
    private IDailyBroadcastRepository _repo;

    public DailyRecordController(IDailyBroadcastRepository repo)
    {
        _repo = repo;
    }
    public IQueryable<DailyBroadcast> Get(DateTime? date=null)
    {
        var dailyBroadcastList = new List<DailyBroadcast>();
        try
        {
            dailyBroadcastList = _repo.GetDailyBroadcastByDate(date??DateTime.Now).ToList();
        }
        catch (Exception ex)
        {
            //Log
        }
        return dailyBroadcastList.AsQueryable();
    }

    public DailyBroadcast Get(int? Id)
    {
        var dailyBroadcast = new DailyBroadcast();
        try
        {
            dailyBroadcast = _repo.GetDailyBroadcastById(Id);
        }
        catch (Exception ex)
        {
            //Log
        }
        return dailyBroadcast;
    }
}

当使用config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); 方法调用方法api/DailyRecord/2017-06-01时,请不要使用datetime参数访问该方法。

我也尝试过路由属性但不受影响。

id:integer

事实上,当我使用id参数传递第二个方法时,服务返回
[HttpGet] [Route("{date:datetime}")]
如何使用两个支持datetime和integer参数的Get方法构建此控制器?

2 个答案:

答案 0 :(得分:1)

使用字符串输入定义1 get方法,并使用TryParse验证输入是否以正确的格式输入。

Get(string val)
{
   DateTime dt, int id;
   if (DateTime.TryParse(val, out dt))
   {
      //Filter by date
   }
   else if (int.TryParse(val, out id))
   {
      //Filter by int
   }
   else
   {
      //Error state
   }
}

答案 1 :(得分:1)

我通过实施this walkthrough

中所示的路线约束解决了这个问题

通过向路径模板添加正则表达式约束,将路径限制为所需的格式:

[HttpGet]
[Route("{date:datetime:regex(\\d{4}-\\d{2}-\\d{2})}")]
public IQueryable<DailyBroadcast> GetByDate(DateTime date) {
    //...
}
  

现在只有表格中的日期&#34; yyyy-mm-dd&#34;会匹配。请注意我们   不要使用正则表达式来验证我们是否有真正的约会。那是   Web API尝试将URI段转换为a时处理   DateTime个实例。无效日期,例如&#39; 2012-47-99&#39;将失败   转换,客户端将收到404错误。