Nea*_*vis 5 c# webclient using httpclient
如果HttpClient的是不应该在使用使用声明,请参阅以下链接: https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ http://www.nimaara.com/2016/11 /01/beware-of-the-net-httpclient/
因此,如果您不应该在 using 语句中使用 HttpClient ,那么为什么有这么多示例将 WebClient 放在 using 语句中(包括 Microsoft);我还没有看到一篇关于不在using语句中放置 WebClient 的文章?最终在最低级别 WebClient 和 HttpClient 最终在同一个地方打开一个 TCP/IP 套接字。是否介于两者之间使 WebClient 可以放入using语句?
注意我提出这个问题是有原因的:我有一个在 WinXP、Win7 完整系统和嵌入式系统上运行的客户端应用程序,我用来将 XML POST 到我的后端主机(CentOS 系统)的代码如下所示:
void PostXml(string url, string xml, int id) {
try
{
//Console.WriteLine("POST Request: " + xml);
using (WebClient wc = new WebClient())
{
wc.Proxy = null; //DEBUG: testing this to see if it helps webclient post failure after time x
wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
Byte[] d = Encoding.ASCII.GetBytes(xml);
//however Async below is better regardless for closing app and non interference with GUI
//Byte[] res = web.UploadData(url, "POST", d); //sychrounous will block until sent and response returned
wc.UploadDataCompleted += new UploadDataCompletedEventHandler(web_UploadDataCompleted);
wc.UploadDataAsync(new Uri(url), "POST", d, id);
}
}
catch (WebException ex)
{
string responseText = "";
using (var reader = new StreamReader(ex.Response.GetResponseStream()))
{
responseText = reader.ReadToEnd();
}
string logMsg = DateTime.Now.ToString("s") + " - PostXml WebClient webexception: " + ex.Message + "\r\n" +
" response: " + responseText + "\r\n\r\n";
File.AppendAllText(SPUClient.frmMain._logFile, logMsg);
}
catch (Exception ex) {
//Console.WriteLine("PostXml Exception: " + ex.Message);
string logMsg = DateTime.Now.ToString("s") + " - PostXml exception: " + ex.Message + "\r\n";
File.AppendAllText(SPUClient.frmMain._logFile, logMsg);
}
}
Run Code Online (Sandbox Code Playgroud)
PostXml 每 1 分钟被调用 2 次,我在该领域有 400 个客户端运行上面的代码,其中一些已经运行了一年多没有错误。但是我们有几个客户端在运行几周后运行此代码,或者几个月只是停止执行 UploadDataAsync("POST") 吗?目前我们所知道的是我们没有收到异常,POST 消息没有离开计算机,并且在我的 CentOS 日志文件中我可以看到它从未到达(CentOS 上的 domain.net.access.log 显示了所有来自我所有客户的 POST 连接)。请记住,这种情况很少发生,有些客户从未失败过,有些客户会在发生这种情况之前运行数月/数周。重新启动客户端应用程序当然可以解决问题。