【问题标题】:Microsoft.AspNetCore.Odata configure datetime serialization to use Utc or omit TimezoneMicrosoft.AspNetCore.Odata 配置日期时间序列化使用 Utc 或省略 Timezone
【发布时间】:2020-08-22 11:58:33
【问题描述】:

我在 Asp.net Web Api Core 3.1 项目中使用Microsoft.AspNetCore.Odata 7.3

事实证明,该库将服务器的 TimeZone 从 Ef 输出添加到 DateTimes。

Ef 本身返回带有DateTimeKind.Unspecified 的数据。

所以我希望 odata 库只是省略 TimeZone 转换,因为 webApi 服务的行为方式是这样的。

问题是如何使odata不添加服务器的TimeZone或以utc(Z格式)返回所有内容。

尝试通过 NewtonSoft serializerSettings 设置它,但它不适用于 OData 端点

services.AddOData();

services.AddMvc(options => {options.EnableEndpointRouting = false;});

services
  .AddControllers()
  .AddNewtonsoftJson(options =>
                {
                    options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
                });

感谢您的帮助!

更新: 在 Ef 级别(通过 ValueConverters)将 DateTimeKind 设置为 Utc 允许服务器将日期时间正确转换为本地时间。 但仍然返回的日期时间不是 Z 格式,而是服务器的本地时区。

【问题讨论】:

  • 遇到了这个问题。我认为采用指定为 UTC 的 DateTime 并将其输出为服务器时区中的 DateTimeOffset 是愚蠢的!谁给出了#(^& 服务器所在的时区。我采用的解决方案是切换到在任何地方使用 DateTimeOffset 并添加 ValueConverters 以确保我总是从 EntityFramework 获取 UTC DateTimeOffsets。如果这听起来对你有用,我可以把它写成答案,但我没有使用 DateTimes 和 OData 的解决方案。
  • Dan,请尝试 bort 的建议 endpoints.SetTimeZoneInfo(TimeZoneInfo.Utc);。它对我有用。

标签: c# odata asp.net-core-webapi


【解决方案1】:

我有类似的设置(在 EF 层也将时间戳视为 UTC)并遇到了同样的问题。

就我而言,我可以使用以下扩展方法修复它:https://docs.microsoft.com/en-us/previous-versions/aspnet/mt135699(v=vs.118)?redirectedfrom=MSDN

示例(Startup.cs)

 app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            if (odataRoutePrefix != null && edmModel != null)
            {
                endpoints.EnableDependencyInjection();
                endpoints.Filter().OrderBy().MaxTop(100).Count().Select();
                endpoints.MapODataRoute("odata", odataRoutePrefix, edmModel);
                endpoints.SetTimeZoneInfo(TimeZoneInfo.Utc);
            }
        });

【讨论】:

  • 这个答案不再正确。似乎这种扩展方法只存在于 .NET Framework 4.x 中,即使在那里,链接也已过时,因为命名空间从 System.Web.OData.Extensions 更改为 Microsoft.AspNet.OData.Extensions。更重要的是,Microsoft.AspNetCore.OData.dll 8.x中没有SetTimeZoneInfo扩展方法,也没有Microsoft.AspNetCore.OData.Extensions包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 2016-12-18
  • 2011-11-23
  • 1970-01-01
相关资源
最近更新 更多