Следует ли использовать WebClient в операторе использования? - PullRequest
0 голосов
/ 13 октября 2018

Если 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 в операторе использования, это может быть причиной чего-то вроде этой проблемы или это что-то еще?

...