【问题标题】: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;
}

它经常工作。 有时,它没有,我得到一个“连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机没有响应”日志中的错误。

过程中是否有问题,或者可能是端点“超时”? 被调用的服务器用户说“我们没有任何问题,我们没有收到请求”。

不确定是否是上面代码的问题(也许某些流没有关闭?)。但我看不出有什么问题。你觉得这有什么问题吗?

【问题讨论】:

    标签: azure httpwebrequest .net-core-2.2


    【解决方案1】:

    这可能是网络问题,经常失败。您需要记住,在请求离开数据中心之前,有几个开关,并且同时发生了无数个请求(您和所有其他 Azure 客户)。

    这可能是暂时性故障,如果您发送另一个请求,它可能会起作用。您需要实现一些重试逻辑来识别故障是否是暂时的。

    更多信息:

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

    这是一个使用 Polly 的示例,强烈推荐甚至在 Azure SDK 中使用:

    https://stackoverflow.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

    【讨论】:

      猜你喜欢
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      相关资源
      最近更新 更多