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;
服务上的方法永远不会被调用。当我删除服务方法上的参数时,该方法正在被调用。请求包含查询字符串上的参数。
如何正确处理参数?
您不应该使用默认的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));