2

Я вызываю сторонний веб-API для обновления некоторых наших данных на их стороне. Я быстро отправляю около пяти заданий, и, как следствие, первые два запроса работают правильно. Последние три, однако, никогда не обновляются. Похоже, что приложение указывает на то, что запрос истекает, но я хочу убедиться, что я не возился с чем-то на моей стороне.WebRequest.GetResponse() Times Out после пары запросов

Я вызываю функцию ниже с помощью Action<string, Dictionary<string,object>> Delegate, и я использую BeginInvoke для асинхронного вызова API. Меня не волнует ответ. Я что-то недопонимаю о WebRequest.GetResponse() или это проблема с конечной точкой?

private void UpdateJobInfo(string jobId, Dictionary<string, object> updates) 
    { 
     var postData = GetJsonEncodedValues(updates); 
     var request = WebRequest.Create(string.Format(JobResultEndpoint, _username, jobId)); 

     request.ContentType = "application/json; charset=utf-8"; 
     request.Method = WebRequestMethods.Http.Put; 
     request.Headers[HttpRequestHeader.Authorization] = GetAuthenticationCredentials(); 
     request.GetRequestStream().Write(Encoding.ASCII.GetBytes(postData), 0, Encoding.ASCII.GetBytes(postData).Length); 

     request.GetResponse(); 
    } 
+0

Из интереса, что вы ожидаете произойдет, если исключение? –

+0

Я выполняю мой «try ... catch» в блоке, вызывающем это, но я полагаю, что если я вызываю метод асинхронно, я никогда не получу эту информацию. Хороший улов. – elucid8

ответ

4

Вы не распоряжаетесь ответом (или даже потоком запросов, хотя это немного другое дело). Это означает, что вы покидаете соединение с сервером до тех пор, пока финализатор не заметил, что ответ может быть завершен. Соединения объединены (по умолчанию) двумя соединениями на каждый URL. Таким образом, ваши более поздние запросы ожидают, что более ранние ответы будут завершены до того, как они смогут получить соединение.

Лучше код:

// Is this definitely what you want? What about non-ASCII data? 
byte[] binaryPostData = Encoding.ASCII.GetBytes(postData); 
using (var requestStream = request.GetRequestStream()) 
{ 
    requestStream.Write(binaryPostData, 0, binaryPostData.Length); 
} 

using (var response = request.GetResponse()) 
{ 
    // We don't care about the response, but we have to fetch it 
    // and dispose it. 
}