2

타사 웹 API를 호출하여 일부 데이터를 업데이트하려고합니다. 저는 약 5 개의 일자리를 빠르게 연속으로 제출했으며, 처음 두 건의 요청이 제대로 작동하고 있습니다. 그러나 마지막 세 개는 결코 업데이트되지 않습니다. 응용 프로그램은 요청이 시간이 초과되었음을 나타내는 것 같지만, 나는 내 편에서 어떤 것도 망치고 있지는 않은지 확인하려고합니다.두 개의 요청 후 WebRequest.GetResponse()가 만료되었습니다.

나는 아래의 함수를 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. 
}