Я создал веб-службу с использованием ASP.NET Web API. Метод:
[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
Проблема с двоеточие (:
) символ в 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>
Если вы не хотите отключать параметры безопасности, вы можете отправить 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
}
Как уже отмечали мои предшественники, символ ":" вызывает ошибку.
Один из способов обойти это - использовать URL-кодированные параметры. Поэтому, когда вы пытаетесь установить параметр lastUpdate вручную: используйте "% 3A" вместо ":" (двоеточие), который представляет собой кодированное URL-символом символ двоеточия.
В случае, если вы создаете маршрут из приложения: HttpUtility.UrlEncode()
- ваш друг.
К сожалению, символ двоеточия (:) вызывает неправильную ошибку запроса, поскольку он является активным символом в схеме URL.
Вам нужно будет найти способ десериализации или принятия его в качестве параметра без символа двоеточия, или поочередно вы можете попробовать и проанализировать свою дату из привязки (#), так как URL-адрес можно безопасно проанализировать с помощью двоеточия внутри привязки. например: http://myserver/api/service/myusername#2008-12-10T12:30:00
Route("service/{applicantUser}#{lastUpdate:datetime?}")
#
ничего не будет передано на сервер.
http://myserver/api/service/myusername/?lastUpdate=2008-12-10T12:30:00
ли этот URL:http://myserver/api/service/myusername/?lastUpdate=2008-12-10T12:30:00