将DateTimeOffset作为WebAPI查询字符串传递id,DateTimeOffsetdate){//dostuff}但是当我从HttpClient实例调用它时,创建一个URL,如:string.Format("http://localhost:1234/api/values/1?date={0}",System.Net.WebUtility.UrlEncode(DateTimeOffset.Now.ToString()));//->"http://localhost:1234/api/values/1?date=17%2F02%2F2015+7%3A18%3A39+AM+%2B11%3A00"我收到一个400响应说参数不存在日期不存在。我也尝试将[FromUri]属性添加到参数,但它仍然没有映射。如果我将它更改为DateTimeOffset?我可以看到它被保留为null并查看Request.RequestUri.Query值是否存在,只是没有映射。最后我尝试不做WebUtility.UrlEncode,它没有任何区别。400响应消息准确地描述了问题,尽管它可能更清楚。属性定义的路由只需要一个参数id,但是Delete方法需要另一个参数date。如果要使用查询字符串提供此值,则需要使用“DateTimeOffset?”使参数可为空,这也会将其变成可选参数。如果日期是必填字段,请考虑将其添加到您的路线中,例如:[Route("api/values/{id}/{date}")]好吧,请忽略我上面输入的内容,这只是格式问题。WebAPI无法确定解析给定值所需的区域性,但如果您尝试在查询字符串中传递JSON格式的DateTimeOffset,例如2014-05-06T22:24:55Z,应该可以。答案要将DateTimeOffset发送到API,请将其格式设置为:2017-04-17T05:04:18.070Z完整的APIURL如下所示:http://localhost:1234/api/values/1?date=2017-04-17T05:45:18.070Z通过这种方式格式化,我可以将DateTimeOffset参数传递到我使用的Azure移动服务ApiController。代码您可以使用ToString(yyy-MM-ddTHH:mm:ss.fffZ)来解析DateTimeOffset。vardateTimeOffsetAsAPIParameter=DateTimeOffset.UtcNow.ToString("yyy-MM-ddTHH:mm:ss.fffZ");string.Format("http://localhost:1234/api/values/1?date={0}",dateTimeOffsetAsAPIParameter);要实现这一点,我正在使用internalstaticclassDateTimeOffsetExtensions{privateconststringIso8601UtcDateTimeFormat="yyyy-MM-ddTHH:mm:ssZ";公共静态字符串ToIso8601DateTimeOffset(thisDateTimeOffsetdateTimeOffset){returndateTimeOffset.ToUniversalTime().ToString(Iso8601UtcDateTimeFormat);}}创建自定义类型转换器,如下所示:返回base.CanConvertFrom(context,sourceType);}publicoverrideboolCanConvertTo(ITypeDescriptorContextcontext,TypedestinationType){if(destinationType==typeof(DateTimeOffset))返回真;返回base.CanConvertTo(context,destinationType);}公众号rrideobjectConvertFrom(ITypeDescriptorContextcontext,CultureInfoculture,objectvalue){vars=valueasstring;}if(s!=null){if(s.EndsWith("Z",StringComparison.OrdinalIgnoreCase)){s=s.Substring(0,s.Length-1)+"+0000";}DateTimeOffset结果;如果(DateTimeOffset.TryParseExact(s,"yyyyMMdd'T'HHmmss.FFFFFFFzzz",CultureInfo.InvariantCulture,DateTimeStyles.None,输出结果)){返回结果;}}returnbase.ConvertFrom(context,culture,value);在启动序列中,比如WebApiConfig.Register,在DateTimeOffset结构中动态添加这个类型转换器:TypeDescriptor.AddAttributes(typeof(DateTimeOffset),newTypeConverterAttribute(typeof(DateTimeOffsetConverter)));您现在可以以ISO8601的紧凑形式传递DateTimeOffset值,它会忽略干扰URL的连字符和冒号:api/values/20171231T012345-0530api/values/20171231T012345+0000api/values/20171231T012345Z请注意,您可能需要包含尾随如果你有小数秒,则在url中斜线api/values/20171231T012345.1234567-0530/如果需要,您也可以将其放入查询字符串中:api/values?foo=20171231T012345-0530使用ISO8601日期时间格式说明符:$"http://localhost:1234/api/values/1?date={DateTime.UtcNow.ToString("o")}"或$"http://localhost:1234/api/values/1?date={DateTime.UtcNow:o}"最好的找出答案的方法是让WebAPI自己生成预期的URL格式:("收到:"+日期);}[Route("offset",Name="Default")]publicIHttpActionResultGet(){varrouteValues=new{date=System.DateTimeOffset.Now};返回这个。RedirectToRoute("偏移",routeValues);当/offset被调用时,响应将返回一个302到查询字符串中包含'date'参数的url。它看起来像这样:http://localhost:54955/offset?date=02/17/201509:25:38+11:00我找不到DateTimeOffset.ToString()的重载以该格式生成字符串值,除非格式以字符串格式明确定义:DateTimeOffset.Now.ToString("dd/MM/yyyyHH:mm:sszzz")希望对您有所帮助。对于那些使用datetime在客户端和服务器之间寻找某种同步的人来说,这是最简单的方法。我为移动应用程序实现了它。它独立于客户的文化。因为我的移动应用程序支持多种文化,所以在这些文化之间使用格式很无聊。Thanks.net有一个称为ToFileTime和FromFileTime的完美功能服务器控制器操作:[HttpGet("PullAsync")]publicasyncTaskPullSync(long?since=null,int?page=null,int?count=null){if(since.HasValue)DateTimeOffsetdate=DateTimeOffset.FromFileTime(since.Value);}Client以上就是C#学习教程:将DateTimeOffset作为WebAPI查询字符串传递给大家分享一下,如果对大家有用还需要了解更多关于C#学习教程,希望大家多多关注它—DateTimeOffsetdateTime=DateTime.Now.ToFileTime();varurl=$"/PullAsync?since={datetime}&page={pageno}&count=10";代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
