Параметры передачи клиента мобильных служб Azure в серверную часть .NET.

Я разрабатываю мобильную службу Azure с серверной частью .NET и клиентским приложением, которое вызывает эту службу.

Служба имеет некоторые параметры метода GetAll.

 public IQueryable<Appointment> GetAllAppointment(DateTime start, DateTime end)
 {
    // TODO: Handle parameters
    return Query();
 }

Клиентский API имеет возможность передавать параметры:

Dictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("start", start.ToString());
parameters.Add("end", end.ToString());           

var query = Appointments.WithParameters(parameters);                

var results = await query.ToEnumerableAsync();
return results;

Метод службы никогда не вызывается. Когда я удаляю параметры метода службы, метод вызывается. Запрос содержит параметры строки запроса.

Как правильно обрабатывать параметры?


person P. Naber    schedule 19.05.2014    source источник


Ответы (1)


Вы не должны использовать метод ToString по умолчанию для преобразования DateTime в строку — это, вероятно, вызовет проблемы с глобализацией. Например, если вы запустите этот код в культуре en-US (такой же, как на сервере), он должен работать нормально:

var parameters = new Dictionary<string, string>();
var start = new DateTime(2014, 4, 16, 0, 0, 0, DateTimeKind.Utc);
var end = new DateTime(2014, 6, 19, 0, 0, 0, DateTimeKind.Utc);
parameters.Add("start", start.ToString());
parameters.Add("end", end.ToString());
var t = MobileService.GetTable<TodoItem>();
var items = t.WithParameters(parameters).ToListAsync().Result;
Console.WriteLine(string.Join(", ", items));

Это приведет к отправке следующего запроса на сервер (добавлены разрывы строк и не экранирован URI для удобочитаемости):

GET /tables/TodoItem?
    start=4/16/2014 12:00:00 AM
     &end=6/19/2014 12:00:00 AM HTTP/1.1

Теперь, если вы запустите его в локали, где формат даты dd/MM/yyyy, тогда запрос будет отправлен, как показано ниже, и эти значения не сопоставляются с DateTime (нет месяца 16 или 19).

GET /tables/TodoItem?
    start=16/4/2014 12:00:00 AM
     &end=19/6/2014 12:00:00 AM HTTP/1.1

Что вы можете сделать, так это использовать универсальный формат (например, ISO 8601), чтобы независимо от культуры клиента сервер всегда получал дату в формате, который он понимает. В приведенном ниже коде показан пример этого.

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("pt-BR");
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("pt-BR");
var isoFormat = "yyyy-MM-dd'T'HH:mm:ss.fff'Z'";
var parameters = new Dictionary<string, string>();
var start = new DateTime(2014, 4, 16, 0, 0, 0, DateTimeKind.Utc);
var end = new DateTime(2014, 6, 19, 0, 0, 0, DateTimeKind.Utc);
parameters.Add("start", start.ToString(isoFormat, CultureInfo.InvariantCulture));
parameters.Add("end", end.ToString(isoFormat, CultureInfo.InvariantCulture));
var t = MobileService.GetTable<TodoItem>();
var items = t.WithParameters(parameters).ToListAsync().Result;
Console.WriteLine(string.Join(", ", items));
person carlosfigueira    schedule 19.05.2014