Как и где было создано TCP-соединение в httpwebrequest и как оно связано с точкой обслуживания?

Я пытаюсь выяснить, когда было установлено соединение TCP при использовании HttpWebRequest, как эти соединения были объединены и повторно использованы с использованием ServicePoint.

Я посмотрел на system.dll и попытался просмотреть код, используя ILSpy и Reflector, почему-то не увидел никаких ссылок на сокеты, установление соединения tcp и т. Д.

Ниже я вставил декомпилированный код - можете ли вы дать мне советы или перенаправить меня, чтобы я мог понять:

  1. Когда было создано TCP-соединение?
  2. Как эти соединения поддерживаются, объединяются и используются повторно с помощью 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

http://blogs.msdn.com/b/jpsanders/archive/2009/05/20/understanding-maxservicepointidletime-and-defaultconnectionlimit.aspx

С уважением!

Другие вопросы по тегам