Проблема с передачей параметра datetime в веб-сервис в GET

1

Я создал веб-службу с использованием 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

  • 0
    http://myserver/api/service/myusername/?lastUpdate=2008-12-10T12:30:00 ли этот URL: http://myserver/api/service/myusername/?lastUpdate=2008-12-10T12:30:00
  • 0
    О да, это работает. Но есть ли способ избежать стиля RPC?
Теги:
web-services
asp.net-web-api

4 ответа

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>
  • 0
    Хорошо спасибо! Как вы думаете, действительно ли опасно отключать проверку?
  • 0
    Ну, я полагаю, это там по очень веской причине. Но лучше подумайте и прочитайте документацию msdn.microsoft.com/en-us/library/hh882339(v=vs.110).aspx
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   
}
0

Как уже отмечали мои предшественники, символ ":" вызывает ошибку.

Один из способов обойти это - использовать URL-кодированные параметры. Поэтому, когда вы пытаетесь установить параметр lastUpdate вручную: используйте "% 3A" вместо ":" (двоеточие), который представляет собой кодированное URL-символом символ двоеточия.

В случае, если вы создаете маршрут из приложения: HttpUtility.UrlEncode() - ваш друг.

0

К сожалению, символ двоеточия (:) вызывает неправильную ошибку запроса, поскольку он является активным символом в схеме URL.

Вам нужно будет найти способ десериализации или принятия его в качестве параметра без символа двоеточия, или поочередно вы можете попробовать и проанализировать свою дату из привязки (#), так как URL-адрес можно безопасно проанализировать с помощью двоеточия внутри привязки. например: http://myserver/api/service/myusername#2008-12-10T12:30:00

  • 0
    это должно быть проанализировано с использованием Route("service/{applicantUser}#{lastUpdate:datetime?}")
  • 0
    В самом деле? Я уверен, что после # ничего не будет передано на сервер.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню