【问题标题】:http get method does not supported when using datetime parameter使用 datetime 参数时不支持 http get 方法
【发布时间】:2017-05-31 16:03:20
【问题描述】:

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

控制器

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 时,它会命中带有id:integer 方法的方法,永远不会命中带有日期时间参数的方法。

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

[HttpGet]
[Route("{date:datetime}")]

事实上,当我用 id 参数commnet第二个方法时,服务返回
The requested resource does not support http method 'GET'
如何使用两个同时支持日期时间和整数参数的 Get 方法构建此控制器?

【问题讨论】:

  • 我认为你做不到。您需要有单独的方法名称。尝试为具有 [HttpGet] 属性的方法命名。
  • 我想我可以做到这一点,我曾经让我这样想的视频课程。
  • @ibubi,您应该添加您的解决方案作为您自己问题的答案。这样一来,那些发现您的解决方案有助于解决类似问题的人就会对您给予奖励。

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


【解决方案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
   }
}

【讨论】:

  • 我还需要配置什么吗?如果我定义这样的方法,我仍然无法获得价值。
【解决方案2】:

我已经通过实现路由约束解决了这个问题,如this walkthrough 所示

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

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

现在只有格式为“yyyy-mm-dd”的日期会匹配。请注意,我们 不要使用正则表达式来验证我们得到了一个真实的日期。那是 当 Web API 尝试将 URI 段转换为 DateTime 实例。诸如“2012-47-99”之类的无效日期将无法 被转换,客户端会收到404错误。

【讨论】:

    猜你喜欢
    • 2013-11-14
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2023-03-26
    • 2012-12-14
    相关资源
    最近更新 更多