Я пытаюсь выяснить, когда TCP-соединение было установлено при использовании HttpWebRequest, как эти соединения были объединены и повторно использованы с помощью ServicePoint.
Я просмотрел файл system.dll и попытался просмотреть код с помощью ILSpy и Reflector, так как не видел ссылок на сокеты, установил tcp-соединение и т.д.
Ниже я вставил декомпилированный код - может ли кто-нибудь дать мне советы или перенаправить меня, чтобы я мог понять:
Фрагмент кода из 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;
}
K, после просмотра кода некоторое время я думаю, что я понял абстракции. В основном сервисная точка, диспетчер точек обслуживания, как было создано соединение tcp, соединения были объединены, поставлены в очередь и т.д., Всегда меня путали. Ниже информация помогла мне - надеюсь, это полезно для других, которые любопытны или пытались понять эти детали:
ServicePoint: абстракция высокого уровня "соединения" с определенным хостом (целевой хост Ip: порт) (для чего для ex, функция servicePointManager FindServicePoint выполняет функцию static ServicePoint (строка host, int port).
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/)
Update:
Похоже, что также полезны следующие две ссылки:
System.Net.ServicePointManager.DefaultConnectionLimit и .MaxServicePointIdleTime
С наилучшими пожеланиями!