Если HttpClient не предполагается использовать в операторе с использованием , см. Следующие ссылки: https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ http://www.nimaara.com/2016/11/01/beware-of-the-net-httpclient/
Так что, если вы не должны использовать HttpClient воператор использования, тогда почему так много примеров помещают WebClient в оператор использования (включая Microsoft);также я еще не видел статью о том, чтобы не помещать WebClient в , используя оператор ?В конечном итоге на самом низком уровне и WebClient, и HttpClient оказываются в одном месте, открывая сокет TCP / IP.Это то, что между ними делает WebClient приемлемым для вставки с использованием оператора ?
Примечание. У меня есть причина задать этот вопрос: у меня есть клиентское приложение, которое работает на WinXP, Win7Полные и встроенные системы, код, который я использую для POST XML на моем внутреннем хосте (система 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);
}
}
PostXml вызывается 2 раза в 1 минуту, у меня 400 клиентов в полекоторые запускают этот код выше, некоторые из них работают без ошибок более года.Но у нас было несколько клиентов, которые запускали этот код после запуска в течение нескольких недель или нескольких месяцев, просто прекратили явно выполнять UploadDataAsync («POST»)?Все, что мы знаем в настоящее время, это то, что мы не получаем исключения, сообщение POST не покидает компьютер, и в моем файле журнала CentOS я вижу, что оно никогда не поступало (domain.net.access.log на CentOS показывает всеPOST соединения от всех моих клиентов).Помните, что это редко случается, некоторые клиенты никогда не подводили, некоторые бегут в течение месяцев / недель, прежде чем это произойдет.Перезапуск клиентского приложения устраняет проблему, конечно.Должен ли я использовать WebClient в операторе использования, это может быть причиной чего-то вроде этой проблемы или это что-то еще?