[英]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 中使用:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.