簡體   English   中英

以這種方式使用 HttpWebRequest 有什么問題?

[英]What's wrong on using HttpWebRequest this way?

這是我從 Azure 向某些端點發出服務器請求的方式:

public T SingleRead<T>(string url, string method, object entity = null)
{
    T returnValue = default(T);
    var resp = GetRESTResponse(url, method, entity);
    string responseText = GetResponseText(resp);
    try
    {
        returnValue = JsonConvert.DeserializeObject<T>(responseText);
    }
    catch (Exception ex)
    {
        return default(T);
    }

    return returnValue;
}

private HttpWebResponse GetRESTResponse(string url, string method, object entity = null)
{
    var address;
    if (!url.StartsWith("http"))
    {
        if (!url.StartsWith("/")) url = $"/{url}";
        address = baseAddress + url;
    }
    else
    {
        address = url;
    }
    
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(address);
    req.Method = method;

    if (entity != null)
    {
        byte[] byteArray = Encoding.Default.GetBytes(JsonConvert.SerializeObject(entity));
        req.ContentLength = byteArray.Length;
        req.ContentType = "application/json";

        Stream dataStream = req.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);

        dataStream.Flush();
        dataStream.Close();
    }

    HttpWebResponse resp;
    try
    {
        resp = (HttpWebResponse)req.GetResponse();
    }
    catch (WebException e)
    {
        Log(e.Reponse);
        resp = (HttpWebResponse)e.Response;
    }

    return resp;
}

private static string GetResponseText(HttpWebResponse resp)
{
    var encoding = Encoding.ASCII;
    string responseText = ".";
    using (var reader = new StreamReader(resp.GetResponseStream(), encoding))
    {
        responseText = reader.ReadToEnd();
    }

    if (resp.StatusCode == HttpStatusCode.InternalServerError || resp.StatusCode == HttpStatusCode.BadRequest || resp.StatusCode == HttpStatusCode.NotFound)
    {
        return "";
    }

    return responseText;
}

它經常工作。 有時,它沒有,我從日志中收到“連接嘗試失敗,因為連接方在一段時間后沒有正確響應,或者建立的連接失敗,因為連接的主機未能響應”錯誤。

程序中是否有錯誤,或者它可能是端點的“超時”? 被調用的服務器用戶說“我們沒有任何問題,我們沒有收到請求”。

不確定它是否是上面代碼的錯誤(也許某些 stream 沒有關閉?)。 但我看不出有什么問題。 你看這有什么麻煩嗎?

這可能是網絡問題,經常失敗。 您需要記住,在請求傳出數據中心之前有多個開關,並且同時發生了無數請求(您和所有其他 Azure 客戶)。

這可能是暫時性故障,如果您發送另一個請求可能會起作用。 您需要實施一些重試邏輯來確定故障是否是暫時的。

更多信息:

https://learn.microsoft.com/en-us/azure/architecture/patterns/retry

這是一個使用 Polly 的示例,強烈推薦並在 Azure SDK 中使用:

https://stackoverflow.com/a/66554740/1384539

https://learn.microsoft.com/en-us/do.net/architecture/microservices/implement-resilient-applications/implement-http-call-retries-exponential-backoff-polly

https://github.com/App-vNext/Polly

暫無
暫無

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

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