Обнаружение удаленного порта в IHttpHandler

#c# #endpoint #ihttphandler

Вопрос:

Эй, как вы получаете удаленный порт для запроса на веб-сервере?

Поэтому мой код должен выглядеть так:

 public class EndpointReflectionHandler : IHttpHandler
{
    public new void ProcessRequest(HttpContext context)
    {
        string address = context.Request.UserHostAddress;
        int port = context.Request.UserHostPort;            //it's not there

        context.Response.ContentType = "text/plain";
        context.Response.Write(address   ":"   port);
    }
}
 

..но я не могу найти ничего, чтобы достать портвейн.

Редактировать. Спасибо Тиму за отличный комментарий:

Вот полный рабочий процесс:

  1. Клиент запускается, открывает сокет
  2. Эй, веб-сервис, какой у меня IP и порт?
  3. Это 1.2.3.4:1234
  4. Эй, другой человек, я буду слушать 1.2.3.4:1234 (хотя для меня это выглядит как 9.9.9.9:9999
  5. Хорошо, чувак, я подключусь к 1.2.3.4:1234
  6. Все счастливы, выпейте пива

Комментарии:

1. Что бы вы сделали с этой информацией, если бы она у вас была? Вы не можете связаться с этим портом. Практически в каждом случае сегодня это порт NAT, который имеет значение только в пределах соединения. Вы можете попробовать context.Request.ServerVariables["REMOTE_PORT"] , но это не принесет вам большой пользы.

2. Привет, Тим. Точно, это НАТ. Поэтому мое клиентское программное обеспечение даже не знает, какой порт оно использует.. хотя IP — адрес доступен. Как бы вы справились с этим?

3. Проверить myip.com у него есть удаленный порт. Так почему же C# не обладает такой способностью?

4. Ваш рабочий процесс не имеет смысла. Как вы думаете, кто будет слушать 1.2.3.4:1234? Этот IP-адрес сопоставляется с маршрутизатором шлюза где-то. Он изобрел номер порта 1234 для этого конкретного исходящего HTTP-соединения, и когда на этот порт поступает трафик от созданного им соединения, он перенаправляет его внутренне. Другой трафик на этом порту отбрасывается. Вы не можете открыть новое соединение с ним.

5. Нет, брат. двунаправленный разъем. Он использует тот же сокет для быстрого вызова веб-метода, чтобы получить номер порта. затем держите его открытым, чтобы другие могли подключиться к нему. иначе как, черт возьми, он может знать, что это его собственный порт? nat все испортит и никогда не скажет вам (по крайней мере, в C#), какой номер внешнего порта….

Ответ №1:

Я понял контекст.Запрос.Переменные сервера[«REMOTE_PORT»].

В этом нет ничего особенного, просто догадки и поиски повсюду 🙂

Комментарии:

1. Вы также можете отдать должное Тиму Робертсу, который первоначально предложил это в комментариях к вопросу.