当前位置: 首页 > 知识库问答 >
问题:

.NET HttpClient在Azure WebApp中响应缓慢或不响应

东弘扬
2023-03-14

我们正在Azure应用服务上运行WebJob和Api。一些WebJob执行对第三方服务(如ebay)的REST呼叫。所有这些都很好,直到几天前,服务开始随机抛出这个错误:

{\"ClassName\":\"System.Net.Http.HttpRequestException\",\"Message\":\"An error occurred while sending the request.\",\"Data\":{},\"InnerException\":{\"ClassName\":\"System.Net.WebException\",\"Message\":\"The underlying connection was closed: An unexpected error occurred on a receive.\",\"Data\":{},\"InnerException\":{\"ClassName\":\"System.IO.IOException\",\"Message\":\"Unable to read data from the transport connection: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.\",\"Data\":{},\"InnerException\":{\"NativeErrorCode\":10060,\"ClassName\":\"System.Net.Sockets.SocketException\",\"Message\":\"A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond\",\"Data\":{},\"InnerException\":null,\"HelpURL\":null,\"StackTraceString\":\"   at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)\\r\\n   at System.Net.Sockets.NetworkStream.EndRead(IAsyncResult asyncResult)\",\"RemoteStackTraceString\":null,\"RemoteStackIndex\":0,\"ExceptionMethod\":\"8\\nEndReceive\\nSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\\nSystem.Net.Sockets.Socket\\nInt32 EndReceive(System.IAsyncResult)\",\"HResult\":-2147467259,\"Source\":\"System\",\"WatsonBuckets\":null},\"HelpURL\":null,\"StackTraceString\":\"   at System.Net.Security._SslStream.EndRead(IAsyncResult asyncResult)\\r\\n   at System.Net.TlsStream.EndRead(IAsyncResult asyncResult)\\r\\n   at System.Net.Connection.ReadCallback(IAsyncResult asyncResult)\",\"RemoteStackTraceString\":null,\"RemoteStackIndex\":0,\"ExceptionMethod\":\"8\\nEndRead\\nSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\\nSystem.Net.Security._SslStream\\nInt32 EndRead(System.IAsyncResult)\",\"HResult\":-2146232800,\"Source\":\"System\",\"WatsonBuckets\":null}

调用有时工作,但非常慢,有时会返回错误。运行服务的本地实例不会导致失败。只有在正式生产环境中,我们才会遇到这些问题。

我们使用HttpClient的一个单例实例来执行调用。

public sealed class Client : HttpClient
    {
        private static volatile Client _instance = new Client();

        static Client()
        {
        }

        private Client() : base(new NativeMessageHandler())
        {
            // limit the connections in parallel to 100 by default
            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

            // if this setting does not work, follow these instructions on app.config
            // ServicePointManager.DefaultConnectionLimit needs to be set before the ServicePoint is created 
            ServicePointManager.DefaultConnectionLimit = 100;
        }

        public static Client Instance => _instance;
    }

我们这样使用客户端调用endpoint:

var client = Client.Instance;
var authenticationHeader = new AuthenticationHeaderValue("Bearer", token.AuthToken);
var url = "https://api.ebay.com/sell/account/v1/fulfillment_policy?marketplace_id=EBAY_DE";
var response = await client.GetMessageAsync(url, m => m.Headers.Authorization = authenticationHeader);

GetMessageAsync方法是一个扩展方法,只执行设置头的操作。

问题开始后不久,微软宣布了这个安全补丁:https://docs.microsoft.com/answers/questions/6842/announcement-samesite-cookie-handling-and-net-fram.html

客户端设置为接受TLS 1.2和1.1。

共有1个答案

周辉
2023-03-14

为了缩小可能的原因,我让易趣和微软支持部门检查了他们的系统。事实证明,这实际上是易趣方面的一个问题。

 类似资料:
  • 我不熟悉vertx和RxJava。我正在尝试实现一个简单的测试程序。然而,我无法理解这个项目的动态。为什么有些请求需要10秒钟以上才能响应? 下面是我的示例测试应用程序 我想知道的是,是什么让我的响应时间变慢了?

  • 问题内容: 我正在使用以下代码从服务器提取简单的JSON提要: 有用。但是,在更改JSON文件并验证是否在浏览器中进行了更改之后,当我再次运行该应用程序时,仍会得到先前的响应。 看来AFNetworking正在某种程度上缓存旧的响应。我不要这种行为。我想下载当前的提要。是否需要某种类型的设置或参数来关闭缓存? 问题答案: 简而言之,只需定义您的AFNetworking经理即可: 请享用!

  • 我有一个DBIx::Class查询,需要太长时间才能完成。 以下所有SQL都是由DBIx::Class生成的。 第一个场景(DBIx简单选择): DBIx查询时间:0.390221s(正常) 第二种场景(使用where的DBIx简单选择): DBIx查询时间:29.27025s!!:( 第三种场景(使用pgadmin3运行上述查询): pgadmin查询时间:25ms(ok) 相同的查询是相当快使

  • 我创建了一个测试项目,其中我结合了两个指南:Quarkus-DynamoDB和Quarkus-HTTP lambda。这样做的最终目标是有一个lambda与DynamoDB通信的示例项目,这一切都是本机编译的(使用GraalVM)。 这运行得相对较好。我设法使用第二个指南中的工具将项目部署到AWS lambda,并且在调用endpoint时得到的响应与预期一致。 然而,我对性能有一些疑问,尤其是在

  • 我已将自动完成功能应用于两个。为此,我使用了自动完成计算器。我观察到它的速度减慢到我甚至无法输入一个字符的程度。有什么解决办法吗? 谢谢

  • 我是JMeter的新手。我已经设置了HTTP请求采样器来发送GET请求到Google.com。我得到的反应是200。但我找不到响应头,它显示了响应中的cookie。我想在下一个请求中使用该cookie值。