0

Windows Azure 開発者の皆様、こんにちは。

Eclipse で Windows Azure 用の PHP SDK を使用して、ローカル コンピューティングおよびストレージ エミュレーターでストレージ テーブルを操作しています。

私はこのコードを実行しています (基本的にはデータを更新しています):

$statistics = AzureStorageTable::connection()->retrieveEntities(self::$statisticsTableName);
    foreach($statistics as $statistic) {
        $block = $statistic->getRowKey();
        if(isset($processedLogs[$block])) {
            $processedLog = $processedLogs[$block];
            $statistic->time    = ($statistic->time + $processedLog[0]);
            $statistic->count   = ($statistic->count + $processedLog[1]);
            $statistic->average = ($statistic->time / $statistic->count);
            AzureStorageTable::connection()->updateEntity(self::$statisticsTableName,$statistic);
        }           
    }

私は得る:

Microsoft_WindowsAzure_Exception

サーバーは要求を認証できませんでした。Authorization ヘッダーの値が、署名を含めて正しく形成されていることを確認してください。

ここで SDK で失敗します。

Storage/Table.php (615) Microsoft_WindowsAzure_Storage_Table-> _changeEntity

エンティティ オブジェクトは次のようになります。

Microsoft_WindowsAzure_Storage_DynamicTableEntity(5) ▼ {
   "_dynamicProperties" protected => array(4) ▼ {
      "timestamp" => stdClass(3) ▼ {
         "Name" => "Timestamp" (9)
         "Type" => "Edm.DateTime" (12)
         "Value" => DateTime(3) { ... }
      }
      "time" => stdClass(3) ▼ {
         "Name" => "time" (4)
         "Type" => "Edm.Double" (10)
         "Value" => 95.899748802185
      }
      "count" => stdClass(3) ▼ {
         "Name" => "count" (5)
         "Type" => "Edm.Int32" (9)
         "Value" => 44
      }
      "average" => stdClass(3) ▼ {
         "Name" => "average" (7)
         "Type" => "Edm.Double" (10)
         "Value" => 2.1795397455042
      }
   }
   "_partitionKey" protected => "timers" (6)
   "_rowKey" protected => "%2F" (3)
   "_timestamp" protected => DateTime(3) ▼ {
      "date" => "2012-04-20 22:51:50" (19)
      "timezone_type" => 3
      "timezone" => "UTC" (3)
   }
   "_etag" protected => "W/"datetime'2012-04-20T22%3A51%3A50.483Z'"" (42)
}

エンティティを削除しようとしたときにも同じエラーが発生しました。

ストレージから取得して同じオブジェクトを使用して更新するのではなく、テーブル エンティティを作成しようとしましたが、うまくいきません。

グーグルによると、時間に問題がある可能性があることはわかっていますが、システムの時間は正しいです (私は UTC+1 です)。どういうわけかストレージのタイムスタンプが実際の時刻より 2 時間遅れていますが、どうすればよいかわかりません。

私は Fiddler2 を持っていますが、http://127.0.0.1:10002 (ローカル テーブル ストレージ) との通信をキャッチするように設定する方法がわかりませ

私が間違っていることを教えてください。

4

2 に答える 2

0

すでに述べたように、問題はシステムのクロックが正しく構成されていないことに関連している可能性があります。ただし、Authorization ヘッダーの値が署名を含めて正しく形成されていることを確認してください。エラーは別の理由で発生している可能性があります。

現時点では、Fiddler2 を試すのが最善の選択肢です。web.config で Fiddler2 をプロキシとして設定してみてください (PHP を使用している場合でも、プロキシがあると思います)。

<system.net>
  <defaultProxy>
    <proxy bypassonlocal="False" proxyaddress="http://127.0.0.1:8888"/>
  </defaultProxy>
</system.net>

テーブル ストレージに HTTP または HTTPS エンドポイントを使用していますか? HTTPS を使用している場合は、Fiddler が HTTPS トラフィックも復号化することも確認する必要があります ([ツール] > [Fiddler オプション] を使用)。

于 2012-04-21T14:06:49.050 に答える
0

だから...それはPHP Azure SDKのバグです:http://phpazure.codeplex.com/

ここで開発者にそれについて話しました: http://phpazure.codeplex.com/workitem/6901

ここにもソリューションを追加しています:

問題は、私がこれを呼び出すときです:

$entity = $storage -> retrieveEntities($tableName);
$entity -> Name = "New name;"
$storage -> updateEntity($tableName,$entity);

Microsoft_WindowsAzure_Exception サーバーが要求を認証できませんでした。Authorization ヘッダーの値が、署名を含めて正しく形成されていることを確認してください。

問題は、retrieveEntities の結果が *Microsoft_WindowsAzure_Storage_DynamicTableEntity* であり、updateEntity が getAzureValues を呼び出し *$this->_dynamicProperties* とparent::getAzureValues()の両方がタイムスタンプを返し、2 つのタイムスタンプを持つ配列になり、エラーが発生することです。

私が行ったホットフィックスは、このコードを追加することでした:

if(isset($this->_dynamicProperties["timestamp"]))unset($this->_dynamicProperties["timestamp"]);

*Microsoft_WindowsAzure_Storage_DynamicTableEntity*のgetAzureValuesで戻る前の行

そして、それは魔法のように機能します:]

このエラーは、古い SDK とトランクの最新の SDK の両方にあります。

于 2012-04-21T21:11:26.837 に答える