Как и где было создано TCP-соединение в httpwebrequest и как оно связано с точкой обслуживания?
Я пытаюсь выяснить, когда было установлено соединение TCP при использовании HttpWebRequest, как эти соединения были объединены и повторно использованы с использованием ServicePoint.
Я посмотрел на system.dll и попытался просмотреть код, используя ILSpy и Reflector, почему-то не увидел никаких ссылок на сокеты, установление соединения tcp и т. Д.
Ниже я вставил декомпилированный код - можете ли вы дать мне советы или перенаправить меня, чтобы я мог понять:
- Когда было создано TCP-соединение?
- Как эти соединения поддерживаются, объединяются и используются повторно с помощью ServicePoint?
Фрагмент кода из HttpWebRequest из System.dll:
public override Stream GetRequestStream()
{
TransportContext context;
return this.GetRequestStream(out context);
}
public Stream GetRequestStream(out TransportContext context)
{
if (Logging.On)
{
Logging.Enter(Logging.Web, this, "GetRequestStream", "");
}
context = null;
this.CheckProtocol(true);
if ((this._WriteAResult == null) || !this._WriteAResult.InternalPeekCompleted)
{
lock (this)
{
if (this._WriteAResult != null)
{
throw new InvalidOperationException(SR.GetString("net_repcall"));
}
if (this.SetRequestSubmitted())
{
throw new InvalidOperationException(SR.GetString("net_reqsubmitted"));
}
if (this._ReadAResult != null)
{
throw ((Exception) this._ReadAResult.Result);
}
this._WriteAResult = new LazyAsyncResult(this, null, null);
this.Async = false;
}
this.CurrentMethod = this._OriginVerb;
while (this.m_Retry && !this._WriteAResult.InternalPeekCompleted)
{
this._OldSubmitWriteStream = null;
this._SubmitWriteStream = null;
this.BeginSubmitRequest();
}
while (this.Aborted && !this._WriteAResult.InternalPeekCompleted)
{
if (!(this._CoreResponse is Exception))
{
Thread.SpinWait(1);
}
else
{
this.CheckWriteSideResponseProcessing();
}
}
}
ConnectStream connectStream = this._WriteAResult.InternalWaitForCompletion() as ConnectStream;
this._WriteAResult.EndCalled = true;
if (connectStream == null)
{
if (Logging.On)
{
Logging.Exception(Logging.Web, this, "EndGetRequestStream", this._WriteAResult.Result as Exception);
}
throw ((Exception) this._WriteAResult.Result);
}
context = new ConnectStreamContext(connectStream);
if (Logging.On)
{
Logging.Exit(Logging.Web, this, "GetRequestStream", connectStream);
}
return connectStream;
}
1 ответ
К, после просмотра кода некоторое время я думаю, что вроде понял абстракции. В основном точки обслуживания, диспетчер точек обслуживания, то, как было создано tcp-соединение, соединения были объединены, поставлены в очередь и т. Д., Всегда смущали меня. Ниже приведенная информация помогла мне - надеюсь, это будет полезно для других, кому интересно или пытались понять эти детали:
ServicePoint: высокоуровневая абстракция "соединения" с конкретным хостом (IP-адрес целевого хоста: порт) (поэтому для ex функция static ServicePoint FindServicePoint (хост-строка, порт int) определена в servicePointManger.
ServicePointManager: поскольку имя указывает на его глобальный (статический) класс, который управляет точками обслуживания.
Соединение (внутренний класс): в основном это то, что, я думаю, представляет TCP-соединение. это в основном происходит от System.Net.PoolStream (внутренний класс - у него есть определения сокетов, которые он использует), который происходит из потока.
ConnectionGroup (внутренний класс): каждый запрос HttpWebRequest связан с группой соединений. (в основном на основе connectionLimit он создает самое большее connectionLimit (может настраиваться глобально через ServicePointManager, а также для каждого httpwebrequest с использованием его свойства servicePoint) количество объектов подключения на httpwebrequest)
Если предел соединения достигнут, он просто ставится в очередь и передается на провод (скорее всего - но все равно не получил код, который делает это).
И если вы подключаетесь к сервису на локальной машине, servicepoint.connectionlimit больше не равен servicepointmanager.defaultconnectionlimit. по умолчанию это; int.Maxvalue (2147483647 или 7FFFFFFF) (вы можете обратиться по адресу: http://blogs.microsoft.co.il/idof/2011/06/20/servicepointmanagerdefaultconnectionlimit-2-depends/)
Обновить:
Похоже, следующие две ссылки тоже полезны:
/questions/46628103/systemnetservicepointmanagerdefaultconnectionlimit-imaxservicepointidletime
С уважением!