以这种方式使用 HttpWebRequest 有啥问题?
Posted
技术标签:
【中文标题】以这种方式使用 HttpWebRequest 有啥问题?【英文标题】:What's wrong on using HttpWebRequest this way?以这种方式使用 HttpWebRequest 有什么问题? 【发布时间】:2021-11-23 00:50:58 【问题描述】:这是我从 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;
它经常工作。 有时,它没有,我得到一个“连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机没有响应”日志中的错误。
过程中是否有问题,或者可能是端点“超时”? 被调用的服务器用户说“我们没有任何问题,我们没有收到请求”。
不确定是否是上面代码的问题(也许某些流没有关闭?)。但我看不出有什么问题。你觉得这有什么问题吗?
【问题讨论】:
【参考方案1】:这可能是网络问题,经常失败。您需要记住,在请求离开数据中心之前,有几个开关,并且同时发生了无数个请求(您和所有其他 Azure 客户)。
这可能是暂时性故障,如果您发送另一个请求,它可能会起作用。您需要实现一些重试逻辑来识别故障是否是暂时的。
更多信息:
https://docs.microsoft.com/en-us/azure/architecture/patterns/retry
这是一个使用 Polly 的示例,强烈推荐甚至在 Azure SDK 中使用:
https://***.com/a/66554740/1384539
https://docs.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/implement-http-call-retries-exponential-backoff-polly
https://github.com/App-vNext/Polly
【讨论】:
以上是关于以这种方式使用 HttpWebRequest 有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章
以这种方式创建 React Native 应用程序有啥问题?
.NET 中的 WebClient 和 HTTPWebRequest 类有啥区别?
转asp.net(c#)使用HttpWebRequest附加携带请求参数以post方式模拟上传大文件(以图片为例)到Web服务器端