Это один из тех вопросов, где вы должны посмотреть глубже и, возможно, переосмыслить исходную проблему; в этом случае «Зачем вам нужен внешний IP-адрес?»
Проблема в том, что у компьютера может не быть внешнего IP-адреса. Например, мой ноутбук имеет внутренний IP-адрес (192.168.x.y), назначенный маршрутизатором. Сам маршрутизатор имеет внутренний IP-адрес, но его «внешний» IP-адрес также является внутренним. Он используется только для связи с модемом DSL, который фактически имеет внешний IP-адрес, выходящий в Интернет.
Таким образом, возникает реальный вопрос: «Как я могу получить IP-адрес устройства, выходящего в Интернет, через 2 прыжка?» И ответ, как правило, нет; по крайней мере, не используя такой сервис, как whatismyip.com, который вы уже отклонили, или совершив по-настоящему масштабный хак, включив жесткое кодирование пароля модема DSL в ваше приложение, запрос модема DSL и очистку экрана страницы администратора (и Бог поможет вам если модем когда-либо будет заменен).
РЕДАКТИРОВАТЬ: Теперь, чтобы применить это к измененному вопросу: «Как мне получить IP-адрес моего клиента от серверного .NET-компонента?» Как и whatismyip.com, лучшее, что сервер сможет сделать, это дать вам IP-адрес вашего устройства, подключенного к Интернету, который вряд ли будет фактическим IP-адресом компьютера, на котором запущено приложение. Возвращаясь к моему ноутбуку, если мой IP-адрес в Интернете был 75.75.75.75, а IP-адрес локальной сети был 192.168.0.112, сервер мог видеть только 75.75.75.75 IP-адрес. Это дойдет до моего модема DSL. Если ваш сервер хочет установить отдельное соединение обратно с моим ноутбуком, мне сначала нужно настроить DSL-модем и любые маршрутизаторы между ним и моим ноутбуком, чтобы они распознавали входящие соединения с вашего сервера и соответствующим образом маршрутизировали их. Есть несколько способов сделать это, но это выходит за рамки этой темы.
Если вы на самом деле пытаетесь установить соединение с сервера обратно к клиенту, переосмыслите свой дизайн, потому что вы углубляетесь в территорию WTF (или, по крайней мере, делаете приложение более сложным для развертывания).