当前位置: 首页 > 知识库问答 >
问题:

Azure表存储返回400错误请求

巩光誉
2023-03-14

我在调试模式下运行它,并附加了一个包含异常详细信息的图像。我怎么知道出了什么问题?我试图在表中插入数据。azure不能告诉我更多细节吗?

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

// 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);
    }
}

共有3个答案

金高轩
2023-03-14

在我的例子中,它是RowKey中的一个正斜杠。

我还收到一个“OutOfRangeInput-其中一个请求输入超出范围”尝试通过存储仿真器手动添加时出错。

关键字段中不允许的字符

PartitionKey和RowKey属性的值中不允许包含以下字符:

  • 正斜杠 (/) 字符
  • 反斜杠 (\) 字符
  • 数字符号 (#) 字符
  • 问号 (?) 字符
  • 从 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();
    }
    

徐正雅
2023-03-14

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

签入调试器:StorageException.RequestInformation.ExtendedInformation

梁华清
2023-03-14

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

大胆猜测一下,我假设你的代码中有一些日期/时间类型属性(OfflineTimestamp、OnlineTimestamp),并观察到在某些情况下,其中一个属性是用默认值“DateTime.MinValue”初始化的。请注意,在Windows Azure[html" target="_blank">http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx]中,日期/时间类型属性允许的最小值是1601年1月1日(UTC)。请看看是否是这样。如果是这样,那么您可以将它们设为可空类型字段,这样它们就不会填充默认值。

看看尤哈·帕洛马基在下面的答案...有时在他建议的异常中有一个稍微有用的消息(请求信息.扩展错误信息.错误消息)

 类似资料:
  • 我正在尝试创建azure存储表,并使用c#向其中插入记录。我已经成功地创建了表,但是在向其中插入记录时,它给出了400错误请求存储异常。 签入调试器后: StorageException.RequestInformation.ExtendedErrorInformation.ErrorMessage 它显示超出范围输入错误 \n请求 Id:862fdbae-6002-000c-1e7c-ef937

  • 问题内容: 这工作正常: 这将返回400 Bad Request(只是使用.ajax来支持错误处理的上述jQuery的重新格式)。 问题答案: 我认为您只需要再添加2个选项(和):

  • 我试图简单地使用Azure创建一个新的存储队列,但它一直崩溃而没有解释,创建表工作正常,这是相关代码: 行< code>healingQueue中的代码崩溃。CreateIfNotExists();以及< code>(400)错误请求的说明 表创建得很好,所以我假设存储帐户没有问题,知道我能做什么吗?

  • 我试图使用Gmail API将用户设置应用到Gmail帐户,但它不断返回错误400错误请求。 我可以看到错误代码在Gmail API控制台,它来自我的服务号,所以代码不可能是如此错误,但它让我发疯,只是不能找出什么是错误的。 如果有人能给我指出正确的方向,我会非常感激。

  • 问题内容: 我有这个应用程序,它可以在本地运行,并且在部署时可以使用.mdf SQL Express数据库文件(通常用于测试目的)。但是,当我将其更改为可与我们的SQL Server 2008一起使用时,该应用程序可以运行,但该服务无法运行。 例如,如果在页面后面的代码中,我有一个按钮可以向表中添加数据,例如: 我的web.config设置为在该服务器上使用模拟,并且一切运行良好。但是,对于我的服

  • 我在本地服务器上找到了它失败的代码: 在我看来,它似乎不能获得或?