簡體   English   中英

在 GET 和 POST HTTP 方法通過 RestSharp 連接失敗后重試的好方法是什么?

[英]What is a decent method for re-trying after failed connection of GET, and POST HTTP Methods via RestSharp?

此 C# 控制台應用程序使用 REST 和 RestSharp 連接到服務器,這台托管的電腦沒有穩定的 inte.net 連接,因此有時連接 go 斷開並想要實現重試循環 x 次。

他們是從另一個 class Example Program.cs 調用的

Login()
{
    // Restsharp code
    // Restsharp receives response

    // based on RestSharp documentation StatusCode 0 means a failed connection usually on this internet is down or server is down.
    if(response.StatusCode == 0)
    {
        Logger.Error("Failed Connection")
        return null;
    }
}
Items GetItemsInventory()
{
    // Restsharp code
    // Restsharp receives response

    // based on RestSharp documentation StatusCode 0 means a failed connection usually on this internet is down or server is down.
    if(response.StatusCode == 0)
    {
        Logger.Error("Failed Connection")
        return null;
    }
    if(response.StatusCode == HttpStatusCode.BadRequest)
    {
        Logger.Error("Data is incorrect")
        return null;
    }
    if(response.StatusCode == HttpStatusCode.Created)
    {
        Logger.Info("Received Data Successfully")
        return Items;
    }
}
void PostItemsInventory()
{
    // Restsharp code
    // Restsharp receives response

    // based on RestSharp documentation StatusCode 0 means a failed connection usually because internet is down, firewall issue or server is down.
    if(response.StatusCode == 0)
    {
        Logger.Error("Failed Connection")
    }
    if(response.StatusCode == HttpStatusCode.BadRequest)
    {
        Logger.Error("Data is incorrect")
    }
    if(response.StatusCode == HttpStatusCode.Created)
    {
        Logger.Info("Data Sent Successfully")
        // does other stuff
    }
}

Program.cs 調用此方法

static void Main(string[] args)
{
    //gets login details
    Login();
    GetItemsInventory(Items);
    //does stuff
    PostItemsInventory(ItemsSold);
}

只有當 RestSharp 返回 StatusCode 0 時,哪里才是實現“x”次重試的好地方或方法。我在考慮每個方法中的 for 循環,或者還有另一種沒有循環的方法。

一般重試

首先我要強調的是,不能對所有的事情都盲目地進行重試。 有一些操作,就其性質而言,在沒有副作用的情況下是不可重復的 因此,我建議檢查給定操作是否滿足這些要求

  • 可能引入的可觀察影響是可以接受的
  • 手術可以重做,沒有任何不可逆的副作用
  • 與承諾的可靠性相比,引入的復雜性可以忽略不計

您還應該知道,如果您沒有收到回復,並不意味着下游系統沒有收到您的請求。 請求-響應 model 的任何時間都可能中斷連接。因此,可能會發生請求被接收、處理甚至響應由服務發出但請求者沒有收到任何響應的情況。

如果操作是冪等的,因為存在重復數據刪除邏輯,或者操作本質上是無副作用的,那么您可以嘗試重新發出請求以克服 transient.network 故障。

波莉的重試

Polly是一個 do.NET 彈性庫,它允許您定義諸如重試之類的策略,然后用它們裝飾任何任意方法。 在您的特定示例中,您可以定義一個重試策略,該策略在收到的狀態代碼為 0 時觸發,並且最多重試x次。

var retryPolicy = Policy
                .HandleResult<IRestResponse>(r => r.StatusCode == 0)
                .WaitAndRetry(x, _ => TimeSpan.FromSeconds(1));

然后你可以像這樣裝飾你的RestClientExecute方法

var response = retryPolicy.Execute(() => restClient.Execute(restRequest));

暫無
暫無

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

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