美文网首页
迷之自信的对象存储 OSS SDK陷入无限等待

迷之自信的对象存储 OSS SDK陷入无限等待

作者: 极无宪 | 来源:发表于2020-05-21 23:12 被阅读0次

    阿里的对象存储 OSS SDK 对于自己的网络可能是特别的自信,sdk中超时时间是-1,也就是不设置超时时间。写这个sdk的作者是认为不可能超时,推送一定能够成功到达么?
    如果遇到网络原因,可能会处于无限等待中,将导致整个程序无反应。
    而MSDN中HttpWebRequest的默认超时时间是100秒。


    本来我用的多线程传输图片,结果一个个的等待,所有线程都处于等待状态中,程序没反应,也不报错,最近一段时间比较频繁。

        public class ClientConfiguration: ICloneable
        {
    ...
       private int _connectionTimeout = -1;//默认为-1
    ...
    }
        internal static class HttpFactory
        {
    ...
            // Set request headers
            private static void SetRequestHeaders(HttpWebRequest webRequest, ServiceRequest serviceRequest,
                                                  ClientConfiguration configuration)
            {
                webRequest.Timeout = configuration.ConnectionTimeout;//默认-1
                webRequest.ReadWriteTimeout = configuration.ConnectionTimeout;//默认-1
                webRequest.Method = serviceRequest.Method.ToString().ToUpperInvariant();
    
                // Because it is not allowed to set common headers
                // with the WebHeaderCollection.Add method,
                // we have to call an internal method to skip validation.
                foreach (var h in serviceRequest.Headers)
                {
                    // Nginx does not accept a chunked encoding request with Content-Length, as detailed in #OSS-2848
                    if (h.Key.Equals(HttpHeaders.ContentLength) && (serviceRequest.UseChunkedEncoding || 
                        (serviceRequest.Content != null && !serviceRequest.Content.CanSeek) || serviceRequest.Content == null))
                    {
                        continue;
                    }
    
                    HttpExtensions.AddInternal(webRequest.Headers, h.Key, h.Value);
                }
    
                // Set user-agent
                if (!string.IsNullOrEmpty(configuration.UserAgent))
                    webRequest.UserAgent = configuration.UserAgent;
            }
    ...
    }
    
    

    解决这个问题的方法很简单,在实例化时,把超时的时间修改一下就好了,代码如下:

        var _configuration = new ClientConfiguration();
        _configuration.ConnectionTimeout = 20000; //单位是毫秒,设置20秒超时
        var _client = new OssClient(endpoint, accessKeyId, accessKeySecret, _configuration);
    

    相关文章

      网友评论

          本文标题:迷之自信的对象存储 OSS SDK陷入无限等待

          本文链接:https://www.haomeiwen.com/subject/pkgzohtx.html