0

我正在开发一个曾经使用 WCF 工作的 iOS 应用程序。我们正在将此产品更改为使用 MVC Web API 而不是 WCF。我遇到了日期问题!它们必须是 JSON 格式,例如

 /Date(1373476260000-0600)/

但实际上返回的是这种格式

/Date(1379484000000)/

它不被 iOS 控制器接受并产生默认日期值(例如,如果它为 null 并且只是将其初始化为默认值(1969 年 12 月 31 日))

我试图将日期解析为所需的 JSON 格式日期字符串,但它导致了异常,因为它需要一个 DateTime 对象。

我还尝试添加以下行:

GlobalConfiguration.Configuration.Formatters.JsonFormatter. SerializerSettings.DateParseHandling = Newtonsoft.Json.DateParseHandling.DateTimeOffset;

添加到 WebApiConfig.cs 文件但它不起作用,然后我尝试将其添加到 AttributeRoutingHttpConfig.cs 文件中,然后添加到 Global.asax 但没有响应!

然后我试过了:

    var appXmlType = GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

还将它们添加到上面提到的 3 个文件中,但没有用!

任何想法如何解决这个问题?

PS:我只能访问 Web API 代码!我无法更改 iOS 代码!

谢谢。

4

2 回答 2

1

首先,请确保您已设置:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings
    .DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;

否则,您将获得 ISO8601 格式而不是 Microsoft 格式。(ISO8601好多了,但是你说不能改变iOS应用。)

然后,您需要意识到对于DateTime值,.Kind对序列化的工作方式有影响。如果你有一个DateTimeKind.Utc,那么它将不包含偏移量,因为这就是这种特定格式的工作方式。

如果要确保始终生成偏移量,请改用该DateTimeOffset值。+0000这将为UTC提供偏移量。

例如:

var settings = new JsonSerializerSettings
                {
                    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
                };

var dt = DateTimeOffset.UtcNow;
var json = JsonConvert.SerializeObject(dt, settings);
Debug.WriteLine(json); // "\/Date(1383153418477+0000)\/"

但是您需要非常小心地使用这种所有消费者都尊重偏移量的方法。例如,如果客户端收到此消息并将其解析为DateTimeusing WCF's DataContractJsonSerializer,则存在一个已知错误,即任何偏移量都将被视为接收计算机的本地时间,而不管该偏移量的实际值是什么。

如果可能,您应该同时切换服务器和应用程序以使用 ISO8601 格式。

于 2013-10-30T17:24:34.207 回答
0

日期的时区部分似乎丢失了 - 尝试在 WebApiConfig 中设置:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
于 2013-10-29T12:46:59.460 回答