Azure移动服务客户端将参数传递给.net后端

本文关键字:net 后端 参数传递 移动 服务 客户端 Azure | 更新日期: 2023-09-27 18:03:57

我正在开发一个带有。net后端和调用该服务的客户端应用程序的Azure移动服务。

服务在gettall方法上有一些参数。

 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;

服务上的方法永远不会被调用。当我删除服务方法上的参数时,该方法正在被调用。请求包含查询字符串上的参数。

如何正确处理参数?

Azure移动服务客户端将参数传递给.net后端

您不应该使用默认的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));