2

我打电话给第三方Web API来更新我们的一些数据。我一直在快速连续提交大约五份工作,而且无疑,前两项请求正常工作。但最后三个从未更新。应用程序似乎表明请求已超时,但我想确保我不会搞乱任何事情。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

出于兴趣,你能指望什么,如果抛出一个异常的情况发生? – 2013-04-05 19:37:31

+0

我正在执行我的'try ... catch'来调用这个块,但我想如果我异步地调用这个方法,我永远不会真的得到这个信息。接得好。 – elucid8 2013-04-05 19:47:07

回答

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. 
}