阿里的对象存储 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);
网友评论