Azure表存储返回400错误请求

我在debugging模式下运行它,并附上一个图像与exception的细节。 我怎么知道哪里出了问题? 我试图在表格中插入数据。 天青不能给我更多的细节?

Obs:存储在Windows Azure上,不在我的机器上。 表已创build,但插入数据时出现此错误

在这里输入图像说明

// Retrieve the storage account from the connection string. Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=***;AccountKey=***"); // Create the table client. CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); // Create the table if it doesn't exist. CloudTable table = tableClient.GetTableReference("EmployeeOnlineHistory"); table.CreateIfNotExists(); 

这里是插入代码:

 public static void SetStatus(Employee e, bool value) { try { // Retrieve the storage account from the connection string. Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=###;AccountKey=###"); // Create the table client. CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); // Create the CloudTable object that represents the "people" table. CloudTable table = tableClient.GetTableReference("EmployeeOnlineHistory"); // Create a new customer entity. if (value == true) { EmployeeOnlineHistory empHistory = new EmployeeOnlineHistory(e.Id); empHistory.IsOnline = true; empHistory.OnlineTimestamp = DateTime.Now; TableOperation insertOperation = TableOperation.Insert(empHistory); table.Execute(insertOperation); } else { TableQuery<EmployeeOnlineHistory> query = new TableQuery<EmployeeOnlineHistory>() .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, e.Id.ToString())); EmployeeOnlineHistory entity = table.ExecuteQuery(query).Take(1).FirstOrDefault(); if ((entity!=null)&&(entity.IsOnline)) { entity.IsOnline = false; entity.OfflineTimestamp = DateTime.Now; entity.OnlineTime = (entity.OfflineTimestamp - entity.OnlineTimestamp); TableOperation updateOperation = TableOperation.Replace(entity); table.Execute(updateOperation); } else { EmployeeOnlineHistory empHistory = new EmployeeOnlineHistory(e.Id); empHistory.IsOnline = false; empHistory.OfflineTimestamp = DateTime.Now; TableOperation insertOperation = TableOperation.Insert(empHistory); table.Execute(insertOperation); } } } catch (Exception ex) { //var details = new System.IO.StreamReader(((Microsoft.WindowsAzure.Storage.StorageException)ex)..Response.GetResponseStream()).ReadToEnd(); LogFile.Error("EmployeeOnlineHistory.setStatus",ex); } } 

400错误意味着你的某个属性的值有问题。 其中一种方法是通过Fiddler跟踪请求/响应,并查看发送到Windows Azure存储的实际数据。

冒险猜测,我假设通过快速浏览一下你的代码,在你的模型中,你有一些date/时间types属性(OfflineTimestamp,OnlineTimestamp),并观察到在某些情况下,其中一个初始化为默认值是“ DateTime.MinValue ”。 请注意, date/时间types属性允许最小值是 Windows Azure中的1601年1月1日(UTC) [http://msdn.microsoft.com/zh-cn/library/windowsazure/dd179338.aspx] 。 请看看是不是这种情况。 如果是这样的话,那么你可以让它们为空的types字段,以便它们不会被默认值填充。

看看下面的JuhaPalomäki的回答……在他提出的例外情况下(RequestInformation.ExtendedErrorInformation.ErrorMessage),有时会有一些稍微有用的消息。

StorageException还包含一些关于错误的更详细的信息。

检入debugging器:StorageException.RequestInformation.ExtendedInformation

在这里输入图像说明

在我的情况下,这是一个RowKey正斜杠。

我还收到了一个'OutOfRangeInput – 其中一个请求input超出范围。 尝试通过存储模拟器手动添加时出错。

在关键字段不允许的字符

PartitionKeyRowKey属性的值不允许使用以下字符:

  • 正斜杠( / )字符
  • 反斜杠( \ )字符
  • 数字符号( )字符
  • 问号( )字符
  • 控制从U + 0000到U + 001F的字符,包括:
    • 水平制表符( \ t )字符
    • 换行( \ n )字符
    • 回车( \ r )字符
    • 控制从U + 007F到U + 009F的字符

http://msdn.microsoft.com/en-us/library/dd179338.aspx

我写了一个扩展方法来处理这个对我来说。

 public static string ToAzureKeyString(this string str) { var sb = new StringBuilder(); foreach (var c in str .Where(c => c != '/' && c != '\\' && c != '#' && c != '/' && c != '?' && !char.IsControl(c))) sb.Append(c); return sb.ToString(); } 

我面临同样的问题,但我的理由是由于规模。 挖掘到额外的exception属性(RequestInformation.ExtendedErrorInformation)之后,find原因:

ErrorCode:PropertyValueTooLarge ErrorMessage:属性值超出允许的最大大小(64KB)。 如果属性值是一个string,则为UTF-16编码,最大字符数应为32K或更less。

有时候是因为你的partitionKey或者rawkey是空的(对我来说就是这样)

我也面临同样的问题。 在我的情况下PartitionKey值没有设置,所以默认情况下,PartitionKey值为null,这导致Object reference not set to an instance of an object. 例外

检查是否为PartitionKey或RowKey提供了适当的值,则可能会遇到此类问题。

我固定我的案件,它工作正常

我的情况:

  1. 行密钥格式不正确(400)。
  2. partitionkey和rowkey的组合不是唯一的(409)。

我得到了一个400错误的请求,因为我正在使用ZRS(区域冗余存储),并且Analytics不适用于这种types的存储。 我不知道我在使用Google Analytics。

我删除了存储容器,并重新创build为GRS,现在它工作正常。

有关所有表服务错误代码的MS文档可以在这里find

在我的情况下:容器名称是大写字母。 使用字符时有一些限制。 在这里输入图像说明

Interesting Posts