Код: Выделить всё
private Stream PostData(WebRequest request, byte[] rawByteData)
{
Stream req = request.GetRequestStream();
req.Write(rawByteData, 0, rawByteData.Length);
return req;
}
public WebRequestResult RequestPostDataWebRequestResult(string url, string postData, IEnumerable headers = null, string contentType = null, int timeout = 300)
{
WebRequestResult webRequestResult = new WebRequestResult();
try
{
byte[] rawByteData;
WebRequest request = PrepareWebRequest(url, postData, headers, out rawByteData, contentType, timeout:timeout);
Stream req = PostData(request, rawByteData);
var response = GetResponseStreamThrow(request);
req.Close();
webRequestResult.Message = response.Item1;
webRequestResult.StatusCode = response.Item2;
webRequestResult.Status = true;
return webRequestResult;
}
catch (Exception e)
{
webRequestResult.Message = e.ToString();
webRequestResult.Status = false;
if (e is WebException webException)
{
webRequestResult.WebExceptionStatus = webException.Status;
if (webException.Response is HttpWebResponse response)
{
webRequestResult.StatusCode = response.StatusCode;
}
}
return webRequestResult;
}
}
private async Task TaskWithTimeout(Task task, int duration)
{
if (duration == 0)
duration = 100 * 1000;
var retTask = await Task.WhenAny(task, Task.Delay(duration)).ConfigureAwait(false);
if (retTask is Task) return task.Result;
return null;
}
Этого не происходит. каждый раз происходит очень редко.
В GetResponseStreamThrow мы вызывали любой из них, но Task.Delay и WebRequest.Timeout не работали.
Код: Выделить всё
WebResponse ws = await TaskWithTimeout(request.GetResponseAsync(), request.Timeout).ConfigureAwait(false);
Код: Выделить всё
WebResponse ws = TaskWithTimeout(Task.Run(request.GetResponse), request.Timeout).Result;
Это действительно ошибка .net, поскольку и WebRequest.Timeout, и Task.Delay для пользовательского тайм-аута, кажется, сделали это не сработало?
Есть ли лучший способ реализовать тайм-аут на стороне клиента, поскольку WebRequest.Timeout не работает для этого сценария?
Подробнее здесь: https://stackoverflow.com/questions/790 ... ny-working