簡體   English   中英

Azure Table Storage query failed with authentication error (Received:Forbidden) 不時出現

[英]Azure Table Storage query failed with authentication error (Received:Forbidden) from time to time

環境:Azure app服務。

Azure 存儲 SDK: WindowsAzure.Storage (9.3.3)

調用(偽代碼):

void QueryAzureTable(){
    while(true){
        var tableClient = new AzureTable();
        var resp = tableClient.Query('table','pk','rk');
        // ...
    }
}

var tasks = new List<Task>();
for (var i = 0; i < 5; i++)
{
    tasks.Add(QueryAzureTable());
}
await Task.WhenAll(tasks).ConfigureAwait(false);

QueryAzureTable 的授權方法:嘗試使用 clientId/secret 和托管身份/MSI,兩者的結果相同。

觀察:

  1. 由於QueryAzureTable()中的 anth 問題,大約一半的請求失敗(請參閱下面的詳細錯誤消息)。
  2. 如果我重新啟動 azure 應用程序服務實例,身份驗證錯誤將消失約 12 小時。

錯誤信息:

  1. 服務器無法驗證請求。 確保正確形成授權 header 的值,包括簽名。
  2. 意外的響應代碼,預期:OK 或 NotFound,收到:Forbidden

我已經檢查並嘗試了此stackoverflow 線程中提到的幾乎所有解決方案,但沒有成功。 猜測這個特定的身份驗證問題可能與多任務有關。

我自己想出了解決方案:添加重試邏輯來更新令牌

void query(...){
    int cnt=0;
    while(true){
        try{
            _client.queryTable(...);
        }
        catch(AuthException ex){
            log.error(ex...);
            var token=new Token(...);
            _client = new AzureTableClient(token);
            cnt++;
            if(cnt==3) throw;
        }
    }
}

這個解決方案的第一個線索是每當有應用服務發布、部署或重啟應用服務時,查詢表 function 運行了一段時間,然后大約 12 小時后,錯誤開始出現。 但不是100%的失敗率。

如果有任何解釋或結論有助於根本原因,請分享您的意見。 在此先感謝:我的盲目猜測是它與多任務有關。 WindowsAzure.Storage (9.3.3) 不能很好地為多任務更新令牌。

希望這可以幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM