我如何得到合理的性能c# WebClient UploadString
本文关键字:性能 WebClient UploadString 何得 | 更新日期: 2023-09-27 18:14:15
我有一个Windows服务,使用WebClient
发送json数据到MVC5 WebAPI。Windows服务和WebClient当前都在同一台机器上。
以每秒10个请求的速度运行了大约15分钟后,每个帖子都要花很长时间才能完成。它可以在大约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毫秒)。
从SO的各种问题和一些博客文章中,我看到有人建议使用HttpWebRequest
来代替能够控制请求的选项。
使用HttpWebRequest
我已经尝试了这些事情没有工作:
- 设置代理为空代理
- 设置代理为
null
- 设置ServicePointManager。DefaultConnectionLimit为任意大的数。
- 禁用
KeepAlive
(我不想,但它是建议的)。 - 根本不打开响应流(有一些影响,但还不够)。
为什么请求需要这么长时间?如有任何帮助,不胜感激。
原来是程序的另一部分,它占用了所有可用的连接。例如,我没有套接字,必须等待一个可用的
我发现通过监控ASP.NET Applications'Requests/Sec
在性能监视器