WebRequest.GetResponse()经过几次请求后超时

时间:2013-04-05 19:32:44

标签: c# .net asynchronous asp.net-web-api system.net.httpwebrequest

我正在调用第三方Web API来更新我们的一些数据。我一直在快速连续提交大约五个工作,但前两个请求工作正常。然而,最后三个永远不会更新。该应用程序似乎表明请求已超时,但我想确保我没有搞乱任何事情。

我正在使用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();
    }

1 个答案:

答案 0 :(得分: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.
}