以这种方式使用 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 类有啥区别?

强制 HttpWebRequest 发送客户端证书

转asp.net(c#)使用HttpWebRequest附加携带请求参数以post方式模拟上传大文件(以图片为例)到Web服务器端

C#使用WebClient与WebRequest有啥不同

C# HttpWebRequest vs HttpClient vs RestSharp