DateTimeOffset'序列化时的异常

本文关键字:异常 序列化 DateTimeOffset | 更新日期: 2023-09-27 17:49:42

我一直在尝试为Azure获得一个新的MVC web角色设置,连接到Azure表服务。我在VS 2012中使用了1.8 Azure SDK和Azure项目模板。我更新了所有的nuget包到最新的,尽管我仍然怀疑WCF对DateTimeOffset的支持有问题,这是版本5中的新功能。

我有一个非常简单的对象,像这样:

[DataServiceEntity()]
[DataServiceKey("PartitionKey", "RowKey")]
public class AppUser : TableEntity
{
}

我有一个MVC动作来创建一个新的AppUser,看起来像这样:

var connectionString = CloudConfigurationManager.GetSetting("DataStorageConnectionString");
var storageAccount = CloudStorageAccount.Parse(connectionString);
var tableClient = storageAccount.CreateCloudTableClient();
var ctx = new TableServiceContext(tableClient);
ctx.AddObject("Users", user);
var response = ctx.SaveChanges();

当这段代码在我的MVC web角色中执行时,我的connectString的结果是UseDevelopmentStorage=true。

SaveChanges调用导致以下异常:

System.NotSupportedException was caught
  HResult=-2146233067
  Message=Can't cast to unsupported type 'DateTimeOffset'
  Source=System.Data.Services.Client
  StackTrace:
       at System.Data.Services.Client.ClientConvert.GetEdmType(Type propertyType)
       at System.Data.Services.Client.DataServiceContext.WriteContentProperty(XmlWriter writer, String namespaceName, ClientProperty property, Object propertyValue)
       at System.Data.Services.Client.DataServiceContext.WriteContentProperties(XmlWriter writer, ClientType type, Object resource, EpmSourcePathSegment currentSegment, Boolean& propertiesWritten)
       at System.Data.Services.Client.DataServiceContext.CreateRequestData(EntityDescriptor box, Boolean newline)
       at System.Data.Services.Client.DataServiceContext.SaveResult.CreateChangeData(Int32 index, Boolean newline)
       at System.Data.Services.Client.DataServiceContext.SaveResult.BeginNextChange(Boolean replaceOnUpdate)
       at System.Data.Services.Client.DataServiceContext.SaveChanges(SaveChangesOptions options)
       at MvcWebRole1.Controllers.UserController.Create(AppUser user) in c:'src'Azure1'MvcWebRole1'Controllers'UserController.cs:line 67
  InnerException: 

当查看TableEntity时,时间戳属性的类型是DateTimeOffset。我一直在调查我的构建中的一个依赖项是旧的并且导致问题的想法,但我还没有能够识别任何旧版本。据我所知,我使用的是最新版本的SDK,最新版本的项目模板,并且更新了所有的包,所以我现在有点不知所措。

** 12/26更新**

我创建了一个新的控制台应用程序,仅使用存储客户端进行测试,并且能够完美地复制该行为。Azure存储客户端核心包在一个多星期前才发布,也许它还没有打算出来。我无法让它与开发存储或实时Azure一起工作,但恢复到1.7汇编,分别来自10月和6月的1.8和1.7 SDK都需要重新编写,但它确实可以与开发存储和Azure一起工作。

DateTimeOffset'序列化时的异常

在我看来,你是在混合访问方法。TableServiceContext来自1。而TableEntity来自2.0存储API。

如果你想使用1。从TableServiceEntity而不是TableEntity派生,并且不要使用这些属性。如果您想使用2.0库,请使用CloudTable和TableOperation而不是TableServiceContext。

您是否尝试过不从TableEntity派生并简单地实现您自己的PartitionKey/RowKey属性作为字符串和时间戳作为DateTime?

同样,尝试在真实的Azure存储帐户上进行测试。在过去的几年里,我发现模拟存储帐户并不是一个有用的Azure存储开发测试平台。