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