【问题标题】:Trouble passing datetime parameter to web service, in GET在 GET 中将 datetime 参数传递给 Web 服务时遇到问题
【发布时间】:2014-12-26 20:56:18
【问题描述】:

我使用 ASP .NET Web API 创建了一个 Web 服务。方法是:

    [HttpGet]
    [Route("service/{applicantUser}/{lastUpdate:datetime?}")]
    public IHttpActionResult getService(String applicantUser, DateTime? lastUpdate = null){
    // some stuff here

 }

如果我这样调用WS:

http://myserver/api/service/myusername/2008-12-10

一切正常,我获得了正确的 json 文件。但如果我尝试添加时间:

http://myserver/api/service/myusername/2008-12-10T12:30:00

我得到错误404 - Bad Request

【问题讨论】:

  • 此网址是否有效:http://myserver/api/service/myusername/?lastUpdate=2008-12-10T12:30:00
  • 哦,是的,它有效。但是,有什么办法可以避免 RPC 风格?

标签: c# asp.net web-services asp.net-web-api


【解决方案1】:

很遗憾,冒号 (:) 字符会导致您的错误请求错误,因为它是 url 架构中的活动字符。

您必须找到一种方法来反序列化或接受它作为不带冒号字符的参数,或者您可以尝试从锚点 (#) 解析您的日期,因为可以使用冒号安全地解析 url一个锚。例如:http://myserver/api/service/myusername#2008-12-10T12:30:00

【讨论】:

  • 这个应该可以使用Route("service/{applicantUser}#{lastUpdate:datetime?}")进行解析
  • 真的吗?很确定# 之后的任何内容都不会传递给服务器。
  • 你是对的!我的错误 - 幸运的是,您似乎也可以在 发送到服务器的查询字符串中有一个冒号,所以这将是:http://myserver/api/service/myusername?t=2008-12-10T12:30:00
【解决方案2】:

问题在于 URL 中的冒号 (:) 字符是不允许的。您可以将参数放在查询字符串中:

http://myserver/api/service/myusername/?lastUpdate=2008-12-10T12:30:00

或者通过将其合并到您的web.config 来禁用验证以检查潜在危险的请求路径:

<system.web>
    <httpRuntime requestPathInvalidCharacters="" requestValidationMode="2.0" />
    <pages validateRequest="false" />
</system.web>

【讨论】:

  • 好的,谢谢!你认为禁用验证真的很危险吗?
  • 好吧,我想它的存在是有充分理由的。但是,最好自己决定并阅读文档msdn.microsoft.com/en-us/library/hh882339(v=vs.110).aspx
  • 为什么不使用编码来做这些事情?
  • @anatol 因为这不能回答所提出的问题。
  • @DavidG 不明白为什么
【解决方案3】:

正如我的前辈已经正确提到的那样,“:”字符会导致错误。

避免这种情况的一种方法是使用 URL 编码参数。因此,当您尝试手动设置 lastUpdate 参数时: 使用“%3A”代替“:”(冒号),这是冒号字符的 URL 编码表示。

如果您从应用程序中构建路由: HttpUtility.UrlEncode() 是你的朋友。

【讨论】:

    【解决方案4】:

    如果您不想禁用安全设置,您可以将 DateTime 作为字符串发送,不带潜在危险符号。像这样发送字符串:

    String date = DateTime.Now.ToString("MM-dd-yyyyTHH-mm-s");
    

    然后,用你的特殊模式在控制器端解析它:

    if (DateTime.TryParseExact(dateToParse, "MM-dd-yyyyTHH-mm-s", new CultureInfo("en-US"), DateTimeStyles.None, out DateTime date)) {
    // your code here   
    }
    

    【讨论】:

    • MM-dd-yyyyTHH-mm-s 不起作用,但感谢您的尝试:)
    猜你喜欢
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2018-10-08
    相关资源
    最近更新 更多