Как получить IP-адрес в проекте ASP.NET Core 8 MVC

Я создаю проект ASP.NET Core 8 MVC и пытаюсь получить IP-адрес с помощью этого кода:

var remoteIpAddress = HttpContext.Connection.RemoteIpAddress;

Но код выдает исключение:

Адрес = 'remoteIpAddress.Address' вызвал исключение типа System.Net.Sockets.SocketException

Пожалуйста, помогите мне решить эту проблему.

Я пытался обновить код, но не смог это исправить.

Каково полное сообщение об исключении и трассировка стека?

Good Night Nerd Pride 17.07.2024 14:03

Область, в которой вы пытаетесь получить IP-адрес со своей серверной части или получить IP-адрес со стороны клиента, тоже хорошо? Потому что иногда RemoteIpAddress доставит только вам ::1, поэтому, если вы отправите форму запроса на клиентскую сторону, это будет легко.

Md Farid Uddin Kiron 17.07.2024 14:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете попробовать это:

HttpContext.Current.Request.UserHostAddress

В ASP.NET Core нет HttpContext.Current.

Guru Stron 17.07.2024 20:25

Как получить IP-адрес в проекте ASP.NET Core 8 MVC

Чтобы получить IP-адрес клиента, мы могли бы реализовать несколько способов. Но, как я уже говорил вам ранее, использование RemoteIpAddress иногда дает вам неправильную октаву, подобную этой ::1.

Я получил IP-адрес разными способами, однако использование fetch('https://api64.ipify.org?format=json') API дает мне большую точность.

Что я сделал, так это то, что кто-то посетил приложение, я вызвал указанную выше конечную точку и привязал IP-адрес в http-запросе в качестве заголовка запроса, поэтому, если я проверю заголовок запроса, после этого я получу IP-адрес пользователя.

У меня есть собственное промежуточное программное обеспечение, где я проверяю context.Request и установил IP-адрес в качестве заголовка файла cookie, вот так document.cookie = clientIpAddress=${data.ip};`

Я также могу просто связать IP-адрес перед отправкой любого запроса ajax, но я сделал это так, чтобы IP-адрес был доступен в httpContext, поэтому я могу получить его в каждом контексте http, где бы он мне ни понадобился.

Давайте посмотрим на практике, как это можно реализовать:

Промежуточное ПО:

public class IpAddressMiddleware
{
    private readonly RequestDelegate _next;

    public IpAddressMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        if (context.Request.Cookies.TryGetValue("clientIpAddress", out var clientIp))
        {
            context.Items["ClientIp"] = clientIp;// Can be set anywhere you need in the context
        }

        await _next(context);
    }
}

Javascript должен интегрироваться в индекс/целевую страницу приложения:

<script src = "https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>

    async function fetchIpAddress() {
        try {
            const response = await fetch('https://api64.ipify.org?format=json');
            const data = await response.json();
            document.cookie = `clientIpAddress=${data.ip}; path=/`;
        } catch (error) {
            console.error('Error fetching IP address:', error);
        }
    }

    function getCookie(name) {
        const value = `; ${document.cookie}`;
        const parts = value.split(`; ${name}=`);
        if (parts.length === 2) return parts.pop().split(';').shift();
    }

    $(document).ready(async function () {
        await fetchIpAddress();

        $.ajaxSetup({
            beforeSend: function (xhr) {
                const clientIpAddress = getCookie('clientIpAddress');
                if (clientIpAddress) {
                    xhr.setRequestHeader('X-Client-IP', clientIpAddress);
                }
            }
        });
    });
    
</script>

Примечание. Как вы можете заметить, beforeSend: function (xhr) также используется, если вы хотите извлечь IP-адрес из вашего ajax-запроса, это зависит от ваших предпочтений.

Получите IP из любого места, используя следующий код:

var checkContext = HttpContext.Items.TryGetValue("ClientIp", out var userIpAddress);
var userIp = userIpAddress;

Выход:

Примечание. Имейте в виду, что программисты абсолютно точно определяют, как они хотят использовать IP-адрес пользователя, я нашел эту проблему бесплатной. Вы можете привязать IP-адрес при отправке запроса своему контроллеру, если вы не хотите привязывать его к файлу cookie или другому месту, так что это тоже будет нормально. Опять же, это предпочтение программиста.

Другие вопросы по теме