#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);
}
}
..но я не могу найти ничего, чтобы достать портвейн.
Редактировать. Спасибо Тиму за отличный комментарий:
Вот полный рабочий процесс:
- Клиент запускается, открывает сокет
- Эй, веб-сервис, какой у меня IP и порт?
- Это 1.2.3.4:1234
- Эй, другой человек, я буду слушать 1.2.3.4:1234 (хотя для меня это выглядит как 9.9.9.9:9999
- Хорошо, чувак, я подключусь к 1.2.3.4:1234
- Все счастливы, выпейте пива
Комментарии:
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. Вы также можете отдать должное Тиму Робертсу, который первоначально предложил это в комментариях к вопросу.