c# - WebRequest.GetResponse() 在几次请求后超时

标签 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();
    }

最佳答案

您没有处理响应(或者实际上是请求流,尽管这是一个稍微不同的问题)。这意味着您将与服务器的连接保持打开状态,直到终结器碰巧注意到响应可以完成为止。连接池中每个 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.
}

关于c# - WebRequest.GetResponse() 在几次请求后超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15842053/

相关文章:

c# - C#如何判断一个excel文件是否写保护?

c# - WPF 数据网格 : How do I access a ComboBox in a specific row of a DataGridTemplateColumn?

c# - 判断位图是否全黑的有效方法是什么?

c# - 如何在 MVC 3 中编辑 Html.DisplayFor 方法的 CSS?

c++ - select() 最大套接字

c# - 服务器上的全局自定义类

.NET SOAP 常见类型

javascript - 调用两个异步函数之一,但不能同时调用两个

java - 等待 CompletableFuture 完成,然后返回不同的值?

c# - 在 C# 中从 Bing Map API 解析 JSON 代码