如何从 C# WebClient UploadString 获得合理的性能
How do I get reasonable performance out of C# WebClient UploadString
我有一个 Windows 服务,它使用 WebClient
将 json 数据发送到 MVC5 WebAPI。 Windows 服务和 WebClient 目前都在同一台机器上。
在它 运行 大约 15 分钟后,每个请求每秒大约 10 个 post 需要不合理的长时间才能完成。它可以从大约 3 毫秒开始完成一个请求,然后建立起来大约需要 5 秒,这对我的应用程序来说太多了。
这是我正在使用的代码:
private WebClient GetClient()
{
var webClient = new WebClient();
webClient.Headers.Add("Content-Type", "application/json");
return webClient;
}
public string Post<T>(string url, T data)
{
var sw = new Stopwatch();
try
{
var json = JsonConvert.SerializeObject(data);
sw.Start();
var result = GetClient().UploadString(GetAddress(url), json);
sw.Stop();
if (Log.IsVerboseEnabled())
Log.Verbose(String.Format("json: {0}, time(ms): {1}", json, sw.ElapsedMilliseconds));
return result;
}
catch (Exception)
{
sw.Stop();
Log.Debug(String.Format("Failed to send to webapi, time(ms): {0}", sw.ElapsedMilliseconds));
return "Failed to send to webapi";
}
}
请求的结果对我来说并不重要。
序列化数据大小从几个字节到大约 1 kB 不等,但这似乎不会影响完成请求所需的时间。
收到请求的 api 控制器几乎立即完成执行(0-1 毫秒)。
从这里的各种问题和一些博客 posts 我看到有人建议使用 HttpWebRequest
而不是能够控制请求的选项。
使用 HttpWebRequest
我已经尝试了这些没有用的东西:
- Setting the proxy to an empty proxy.
- Setting the proxy to
null
- Setting the ServicePointManager.DefaultConnectionLimit to an arbitrary large number.
- 禁用
KeepAlive
(我不想,但有人建议)。
- 根本没有打开响应流(有一些影响但还不够)。
为什么请求需要这么长时间?非常感谢任何帮助。
原来是程序的另一部分占用了所有可用的连接。 IE。我没有插座了,不得不等待免费的。
我通过在性能监视器中监视 ASP.NET Applications\Requests/Sec
发现的。
我有一个 Windows 服务,它使用 WebClient
将 json 数据发送到 MVC5 WebAPI。 Windows 服务和 WebClient 目前都在同一台机器上。
在它 运行 大约 15 分钟后,每个请求每秒大约 10 个 post 需要不合理的长时间才能完成。它可以从大约 3 毫秒开始完成一个请求,然后建立起来大约需要 5 秒,这对我的应用程序来说太多了。
这是我正在使用的代码:
private WebClient GetClient()
{
var webClient = new WebClient();
webClient.Headers.Add("Content-Type", "application/json");
return webClient;
}
public string Post<T>(string url, T data)
{
var sw = new Stopwatch();
try
{
var json = JsonConvert.SerializeObject(data);
sw.Start();
var result = GetClient().UploadString(GetAddress(url), json);
sw.Stop();
if (Log.IsVerboseEnabled())
Log.Verbose(String.Format("json: {0}, time(ms): {1}", json, sw.ElapsedMilliseconds));
return result;
}
catch (Exception)
{
sw.Stop();
Log.Debug(String.Format("Failed to send to webapi, time(ms): {0}", sw.ElapsedMilliseconds));
return "Failed to send to webapi";
}
}
请求的结果对我来说并不重要。
序列化数据大小从几个字节到大约 1 kB 不等,但这似乎不会影响完成请求所需的时间。
收到请求的 api 控制器几乎立即完成执行(0-1 毫秒)。
从这里的各种问题和一些博客 posts 我看到有人建议使用 HttpWebRequest
而不是能够控制请求的选项。
使用 HttpWebRequest
我已经尝试了这些没有用的东西:
- Setting the proxy to an empty proxy.
- Setting the proxy to
null
- Setting the ServicePointManager.DefaultConnectionLimit to an arbitrary large number.
- 禁用
KeepAlive
(我不想,但有人建议)。 - 根本没有打开响应流(有一些影响但还不够)。
为什么请求需要这么长时间?非常感谢任何帮助。
原来是程序的另一部分占用了所有可用的连接。 IE。我没有插座了,不得不等待免费的。
我通过在性能监视器中监视 ASP.NET Applications\Requests/Sec
发现的。