2014-12-07 1 views
1

У меня есть контроллер веб-службы, который пытается получить словарь строк/объектов. Я думал, что, поскольку он может неявно преобразовать объект, о котором идет речь (DateTime) в строку, мне не нужно будет использовать атрибут [FromUri], но когда я его отлаживал, он был пустым. Поэтому я бросаю [FromUri] там, и у него есть словарь, но он пуст. Ури выглядит так:Атрибут FromUri не работает для словаря string/object

http://localhost:2806/api/Controller/[email protected]=11/1/14&@EndDate=12/1/14 

Может ли кто-нибудь увидеть очевидную проблему? Пожалуйста, дайте мне знать, поможет ли больше контекста.

Мой контроллер выглядит следующим образом:

[HttpGet] 
    public HttpResponseMessage MethodName([FromUri]Dictionary<string, object> parametersDictionary) 
    { 
     try 
     { 
      var messages = DbBuisnessLogic.GetDataFromDb(parametersDictionary); 
      var json = JsonConvert.SerializeObject(messages); 
      return Request.CreateResponse(HttpStatusCode.OK, json); 
     } 
     catch (Exception e) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, new HttpError(e.Message)); 
     } 
    } 
+0

- Почему строка запроса содержит пробелы? - Что вы используете для кодирования ваших данных в строке запроса? - если вы можете показать нам API-интерфейс веб-интерфейса, который поможет. –

+0

Спасибо, что указали пробелы. Я добавил контроллер. – will

ответ

1

Это будет работать, если ваш URL выглядел как:

http://localhost/api/Controller/MethodName/?parametersDictionary[0].Key=StartDate&parametersDictionary[0].value=20141201T0003Z&parametersDictionary[1].Key=EndDate&parametersDictionary[1].Value=20141207T0003Z 

Вы заметите, формат даты передается различно. это потому, что косые черты в вашем примере Uri не разрешены (как косые черты используются как часть маршрута).

Я также рекомендовал бы изменить вашу стратегию использования Словаря, прочитанного из Uri в целом. Его немного уродливое, и если вы просто принимаете определенное количество параметров (то есть только начало и конец даты), тогда я бы определил только маршрут, который их принимает в явном виде. В Uri он выглядит хуже, и с ним легче справиться. Я предполагаю, что приведенный вами пример - это упрощенная версия того, чего вы пытаетесь достичь, но даже тогда, если вы знаете все возможные значения, которые хотите принять, а затем определите их. Пример:

public HttpResponseMessage Get([FromUri]DateTime startDate, [FromUri]DateTime endDate) 

Затем вызовите

http://localhost/api/Controller/MethodName/?startDate=20141201T0003Z&endDate=20141207T0003Z 
+0

Удивительный! Есть ли название для форматирования, в которое вы ввели эту дату? – will

+0

Я считаю, что это ISO 8601 http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a003169674.htm – MartinM

+0

Было ли предложение работать на вас? – MartinM