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

2

Я пытаюсь выяснить, когда 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;
    }
Теги:
tcp

1 ответ

4
Лучший ответ

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

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

С наилучшими пожеланиями!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню