Как запретить httpwebrequest открывать новое TCP-соединение для каждого запроса PUT? - PullRequest
0 голосов
/ 14 июля 2020

Всякий раз, когда мне нужно ПОСТАВИТЬ строку json на сервер, я запускаю новый поток, содержащий этот код внутри класса. Работает нормально, но дело в том, что TCP-соединение открывается для каждого запроса. Когда я проверил хэш-код ServicePoint, он был одинаковым для каждого запроса. Когда я посмотрел в TCPView, я не смог найти эти соединения - я думаю, это потому, что он открывался и закрывался в течение ~ 50 мс. Итак, 2 вопроса -

  1. Будет ли проблема, если я оставлю так? Новый запрос будет отправляться от клиента каждую секунду.
  2. Как мне повторно использовать одно и то же TCP-соединение? Что, если я установлю для ServicePoint.KeepAlive значение true?
        public void SendRequest()
        {
            string sOutput="";
            try
            {
                HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create(_uri);
                myWebRequest.Timeout = Timeout;
                myWebRequest.ReadWriteTimeout = Timeout;
                myWebRequest.ContentType = "application/json";
                myWebRequest.Method = "PUT";
                myWebRequest.Proxy = WebRequest.GetSystemWebProxy();
                ServicePointManager.CheckCertificateRevocationList = true;
                using (StreamWriter myStreamWriter = new StreamWriter(myWebRequest.GetRequestStream()))
                {
                    myStreamWriter.Write(_json);
                }
                using (HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse())
                {
                    using (StreamReader myStreamReader = new StreamReader(myWebResponse.GetResponseStream()))
                    {
                        sOutput = myStreamReader.ReadToEnd();
                        sOutput = sOutput.Length == 0 ? myWebResponse.StatusDescription : sOutput;
                        ServicePoint currentServicePoint = myWebRequest.ServicePoint;
                        sOutput = currentServicePoint.GetHashCode().ToString();
                        currentServicePoint.ConnectionLimit = 5;
                    }
                }
            }
            catch (Exception Ex)
            {
                sOutput = Ex.Message;
            }
            finally
            {
                callback?.Invoke(sOutput);
            }

        }

А вот как я запускаю поток -

                    HTTPClass hTTPClass = new HTTPClass(cuURI, json, 5000, new MyCallback(ResultCallBack));
                    Thread t = new Thread(new ThreadStart(hTTPClass.SendRequest));
                    t.Start();

Вот код после переключения на HttpClient -

static HttpClient client = new HttpClient();

public async Task Write()
        {
            await WriteAsync(cuURI, json);

        }

private async Task WriteAsync(Uri uri, string json)
        {
            StringContent content = new StringContent(json,Encoding.UTF8,"application/json");

            await client.PutAsync(uri, content);
        }

Вот скриншот трассировки wirehark, на котором показано новое соединение для каждого запроса.

введите описание изображения здесь

Клиент самостоятельно устанавливает флаг FIN, и сервер не отправляет FIN со своей стороны. Что происходит, так это то, что я вижу много соединений в состоянии TIME_WAIT на стороне сервера.

...