133

これをデバッグ モードで実行し、例外の詳細を示す画像を添付します。何が問題だったのかを知るにはどうすればよいですか? テーブルにデータを挿入しようとしていました。紺碧は私に詳細を教えてもらえませんか?

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

22 に答える 22

174

400 エラーは、プロパティのいずれかの値に問題があることを意味します。これを確認する方法の 1 つは、Fiddler を介して要求/応答を追跡し、Windows Azure ストレージに送信される実際のデータを確認することです。

大雑把な推測ですが、モデルにいくつかの日付/時刻型のプロパティ (OfflineTimestamp、OnlineTimestamp) があり、特定のシナリオではそれらの 1 つがデフォルト値で初期化されていることを観察したコードをざっと見てみると仮定します。 「DateTime.MinValue」です。Windows Azure [http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx]では、日付/時刻型の属性に許可される最小値は 1601 年 1 月 1 日 (UTC)であることに注意してください。そうでないかどうかを確認してください。その場合は、null 許容型フィールドにして、デフォルト値が入力されないようにすることができます。

以下の Juha Palomäki の回答もご覧ください。

于 2013-02-14T02:29:23.837 に答える
144

StorageException には、エラーに関するもう少し詳細な情報も含まれています。

デバッガーでチェックイン: StorageException.RequestInformation.ExtendedInformation

ここに画像の説明を入力

于 2014-08-20T08:57:39.567 に答える
60

私の場合、それはRowKeyのスラッシュでした。

「OutOfRangeInput - 要求入力の 1 つが範囲外です」というメッセージも受け取りました。ストレージ エミュレーターを介して手動で追加しようとすると、エラーが発生します。

キー フィールドで使用できない文字

次の文字は、 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();
}
于 2014-03-14T18:05:31.337 に答える
6

私は同じ問題に直面しましたが、私の場合の理由はサイズが原因でした。追加の例外プロパティ (RequestInformation.ExtendedErrorInformation) を掘り下げた後、理由が見つかりました。

ErrorCode : PropertyValueTooLarge ErrorMessage: プロパティ値が最大許容サイズ (64KB) を超えています。プロパティ値が文字列の場合、UTF-16 でエンコードされ、最大文字数は 32K 以下である必要があります。

于 2016-06-10T20:21:28.340 に答える
5

さて、私の場合、私はこれをやろうとしていました:

CloudBlobContainer container = blobClient.GetContainerReference("SessionMaterials");
await container.CreateIfNotExistsAsync();

ContainerName が原因でSessionMaterials(Pascal Case と Camel Case で書く習慣として :D)、400 の不正な要求が発生していました。だから、作るしかないsessionmaterials。そしてそれはうまくいきました。

これが誰かに役立つことを願っています。

PS:- 例外 http 応答を確認するか、フィドラーを使用して要求と応答をキャプチャします。

于 2018-05-24T08:10:34.643 に答える
3

時々それはあなたのpartitionKeyまたはrowKeyあるからですNULL

(私の場合はそうでした)

于 2016-06-07T13:07:58.437 に答える
0

私も同じ種類の問題に直面しました。私の場合、PartitionKey 値が設定されていないため、デフォルトで PartitionKey 値が null であり、Object reference not set to an instance of an object.例外が発生しました

PartitionKey または RowKey に適切な値を指定しているかどうかを確認してください。このような問題に直面する可能性があります。

于 2015-09-01T19:45:45.043 に答える
0

ZRS (Zone Redundant Storage) を使用していたため、400 Bad Request を受け取っていましたが、このタイプのストレージでは Analytics を使用できません。Analytics を使用していることに気づきませんでした。

ストレージ コンテナーを削除し、GRS として再作成したところ、正常に動作するようになりました。

于 2016-11-06T06:07:28.707 に答える
0

文字列フィールドに長すぎる値を入力しようとすると、400-BadRequest 応答が返されました。

「UTF-16 でエンコードされた値。文字列値のサイズは最大 64 KiB です。サポートされる最大文字数は約 32 K 以下であることに注意してください。」

https://docs.microsoft.com/en-us/rest/api/storageservices/understanding-the-table-service-data-model

于 2020-12-31T10:40:29.073 に答える