无法在GET中将datetime参数传递给Web服务

时间:2014-10-30 17:20:42

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

我使用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

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

不幸的是冒号(:)字符导致错误请求错误,因为它是网址架构中的活动字符。

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

答案 2 :(得分:0)

正如我的前任已经正确提到的那样,&#34;:&#34;字符导致错误。

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

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

答案 3 :(得分:0)

如果您不想禁用安全设置,可以将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   
}
相关问题