Я создаю проект ASP.NET Core 8 MVC и пытаюсь получить IP-адрес с помощью этого кода:
var remoteIpAddress = HttpContext.Connection.RemoteIpAddress;
Но код выдает исключение:
Адрес = 'remoteIpAddress.Address' вызвал исключение типа System.Net.Sockets.SocketException
Пожалуйста, помогите мне решить эту проблему.
Я пытался обновить код, но не смог это исправить.
Область, в которой вы пытаетесь получить IP-адрес со своей серверной части или получить IP-адрес со стороны клиента, тоже хорошо? Потому что иногда RemoteIpAddress
доставит только вам ::1
, поэтому, если вы отправите форму запроса на клиентскую сторону, это будет легко.
Вы можете попробовать это:
HttpContext.Current.Request.UserHostAddress
В ASP.NET Core нет HttpContext.Current
.
Как получить 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 или другому месту, так что это тоже будет нормально. Опять же, это предпочтение программиста.
Каково полное сообщение об исключении и трассировка стека?