2012-06-26 4 views
4

Я делаю длинный запрос с HttpWebRequest асинхронно. Пока выполняется запрос, я хотел бы получить локальный порт запроса (т. Е. Тот, который находится на клиенте, а не на сервере). Как мне это сделать?Как получить локальный номер порта HttpWebRequest?

Я просмотрел HttpWebRequest.ServicePoint.BindIPEndPointDelegate, но это просто позволяет вызывающему указать локальный addy/port. В идеале я хотел бы позволить HttpWebRequest нормально выбирать свой локальный порт, а затем спрашивать его, что он выбрал.

+0

Просто интересно, почему вы хотите это знать. –

+0

Я злоупотребляю HTTP для создания механизма уведомления. Я хочу знать порт, чтобы другие потоки могли сообщать серверу, какой канал уведомлений принадлежит им. – Erigami

+0

Но вы рассматривали другие механизмы over-HTTP? Например, WCF. Что находится на другом конце вашего HttpWebRequest? –

ответ

0

К сожалению, класс HttpWebRequest действительно не предоставляет то, о чем вы просите.

Я не рекомендую, что я скажу ниже, чтобы использоваться в производстве. Это просто программист весело.

ServicePoint класс имеет частный NetworkStream элемент под названием m_NetworkStream, экспонируют через внутреннего собственности NetworkStream.

Как вы уже знаете, NetworkStream уже предоставляет публичное свойство Socket, которое дает вам базовый сокет, из которого вы можете получить доступ к локальной конечной точке IP.

Таким образом, единственная задача состоит в том, чтобы получить PropertyInfo для ServicePoint.NetworkStream, получить его значение для конкретного экземпляра HttpWebRequest, а оттуда на нем - прямая линия.

Примечание: Для правильного решения вы можете взглянуть на Windows HTTP Services, а затем создать вокруг него управляемую оболочку (если ее еще нет).

Наслаждайтесь!

+0

Я всегда задумываюсь над небольшим программистом, но размышляя над тем, что глубоко чувствует себя немного грязным. :) – Erigami

+0

@Erigam: Конечно, это грязно, не спорь с этим. Я уже упоминал, что это не должно использоваться в производстве. –

+0

@MarcelNita Перечисление через свойства ServicePoint Я не вижу свойства NetworkStream, о котором вы говорите. У меня есть BindingFlags.Instance | BindingFlags.NonPublic. – Despertar

Смежные вопросы