我使用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
答案 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
}