1

データにアクセスすると、テーブルストレージからランダムエラーが発生します。

System.Data.Services.Client.DataServiceClientException: <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
 <code>AuthenticationFailed</code>
 <message xml:lang="en-US">Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:67cd9503-7a10-48a9-8c97-fee3906ac8cb
Time:2012-06-19T08:20:42.0670051Z</message>
</error>
  at System.Data.Services.Client.QueryResult.Execute()
  at System.Data.Services.Client.DataServiceRequest.Execute[TElement](DataServiceContext context, QueryComponents queryComponents)

エラーとWebアプリケーションに関するいくつかの事実は次のとおりです。

  • 私たちのサイトをホストしている5つの中規模のウェブサーバーがあります
  • 私たちのサイトにはいつでも200〜500人の訪問者がいます。そして、彼らは絶えずクリックしています。
  • データはクリックするたびにテーブルストレージからロードされ、保存される場合もあります。
  • エラーは1日に20〜50回だけ発生します。

私が困惑しているのは、大量のページの読み込みやAJAXコールバックが行われているのに比べて、このエラーが頻繁に発生しないことです。

このエラーの原因は何ですか?サーバーの時間がオフの場合、タイムスタンプの問題が発生する可能性があることを読みましたが、ライブサーバーの時間が間違っているのはなぜですか。また、エラーが常に発生しないのはなぜですか。

4

2 に答える 2

1

わかりました、ようやく問題の原因がわかりました。DataSource クラスの静的および非静的内部変数の組み合わせが不適切でした。

private static CloudStorageAccount storageAccount;
private CharacterContext _context;

storageAccount 変数は静的であるため、DataSource オブジェクトをインスタンス化するときに、同時要求が競合して別のストレージ アカウントに変更されます。

public CharacterDataSource()
{
      storageAccount = CloudStorageAccount.FromConfigurationSetting(ServiceConfigurationHelper.GetTableStorageConnectionStringConfigKey(GameInstanceName));
      _context = new CharacterContext(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials);
}

この小さな問題のため、_context オブジェクトのインスタンス化は、実際には、storageAccount.TableEndpoint.AbsoluteUri にアクセスするときに 1 つのストレージ アカウントを使用し、storageAccount.Credentials にアクセスするときに別のストレージ アカウントを使用する可能性があります。そして、これが AuthenticationFailed エラーの原因でした。

storageAccount 変数を静的にする理由はまったくなかったので、解決策は単純にこの修飾子を削除することでした。それ以来、エラーは発生していません。

Microsoft から得たヒントは、ストレージ アカウントに間違った資格情報を使用していたというものでした。これは取得したスタック トレースでは確認できませんでした。マイクロソフトの担当者がどこで情報を見つけたのかはわかりませんが、彼らに連絡できてよかったです。

于 2012-08-08T14:33:14.400 に答える
0

この種の問題の一般的な理由は、サーバー時間がオフになっていることですが、アプリケーションが Azure で実行されており、それほど多くは発生しないため、これを除外します。

質問で述べたように、サイトには常に 200 から 500 人のユーザーがいます。これは、正しく機能する数千のトランザクションがあり、ごく少数のエラーしかないことを意味します。2 つの提案があります。

  1. Microsoft に電話し、RequestId と時間を提供して、本当の原因を調査できるようにします。
  2. 再試行ポリシーを実装します。ご存知かもしれませんが、Table Storage には既に再試行ポリシーが付属しています。しかし、あなたの場合、この再試行ポリシーは403 (および他のすべての 400) エラー コードで再試行しないため、これでは十分ではありません。そのため、カスタムの再試行ポリシーの構築を検討できます。同意しない人もいるかもしれませんが、この種の問題は一時的な障害だと思います。これは、すべてのトランザクションの 0.5% 未満でランダムに発生するためです。その場合は、再試行ポリシーを使用して処理します。
于 2012-06-19T11:03:25.433 に答える