tag route net for data asp all c# asp.net-core asp.net-core-mvc

c# - route - tag helpers asp net core



¿Cómo obtengo la dirección IP del cliente en ASP.NET CORE? (10)

En ASP.NET 2.1, en StartUp.cs, agregue estos servicios:

services.AddHttpContextAccessor(); services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();

y luego haz 3 pasos:

  1. Defina una variable en su controlador MVC

    private IHttpContextAccessor _accessor;

  2. DI en el constructor del controlador

    public SomeController(IHttpContextAccessor accessor) { _accessor = accessor; }

  3. Recuperar la dirección IP

    _accessor.HttpContext.Connection.RemoteIpAddress.ToString()

Así es como se hace.

¿Puede decirme cómo obtener la dirección IP del cliente en ASP.NET cuando use MVC 6. Request.ServerVariables["REMOTE_ADDR"] no funciona.


En mi caso, tengo la aplicación web DotNet Core 2.2 ejecutándose en DigitalOcean con docker y nginx como proxy inverso. Con este código en Startup.cs puedo obtener la IP del cliente

app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.All, RequireHeaderSymmetry = false, ForwardLimit = null, KnownNetworks = { new IPNetwork(IPAddress.Parse("::ffff:172.17.0.1"), 104) } });

:: ffff: 172.17.0.1 era la ip que estaba recibiendo antes de usar

Request.HttpContext.Connection.RemoteIpAddress.ToString();


En project.json agregue una dependencia a:

"Microsoft.AspNetCore.HttpOverrides": "1.0.0"

En Startup.cs , en el método Configure() agregue:

app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto });

Y por supuesto:

using Microsoft.AspNetCore.HttpOverrides;

Entonces, podría obtener la ip usando:

Request.HttpContext.Connection.RemoteIpAddress

En mi caso, al depurar en VS siempre obtuve IpV6 localhost, pero cuando se implementaba en un IIS siempre obtenía la IP remota.

Algunos enlaces útiles: ¿Cómo obtengo la dirección IP del cliente en ASP.NET CORE? y RemoteIpAddress siempre es nulo

El ::1 se debe quizás a:

Las conexiones terminan en IIS, que luego reenvía a Kestrel, el servidor web v.next, por lo que las conexiones al servidor web son de localhost. ( https://.com/a/35442401/5326387 )


Esto funciona para mí (DotNetCore 2.1)

[HttpGet] public string Get() { var remoteIpAddress = HttpContext.Connection.RemoteIpAddress; return remoteIpAddress.ToString(); }


La API ha sido actualizada. No estoy seguro de cuándo cambió, pero según Damien Edwards a fines de diciembre, ahora puede hacer esto:

var remoteIpAddress = request.HttpContext.Connection.RemoteIpAddress;


Primero, en .Net Core 1.0 Agregar using Microsoft.AspNetCore.Http.Features; al controlador Luego dentro del método relevante:

var ip = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress?.ToString();

Leí varias otras respuestas que no se pudieron compilar porque estaba usando un httpContext en minúscula, lo que llevó al VS a agregar usando Microsoft.AspNetCore.Http, en lugar del uso apropiado, o con HttpContext (el compilador también es engañoso).


Puede usar IHttpConnectionFeature para obtener esta información.

var remoteIpAddress = httpContext.GetFeature<IHttpConnectionFeature>()?.RemoteIpAddress;


Se puede agregar alguna lógica de respaldo para manejar la presencia de un equilibrador de carga.

Además, a través de la inspección, el encabezado X-Forwarded-For se establece de todos modos incluso sin un equilibrador de carga (¿posiblemente debido a una capa adicional de Kestrel?):

public string GetRequestIP(bool tryUseXForwardHeader = true) { string ip = null; // todo support new "Forwarded" header (2014) https://en.wikipedia.org/wiki/X-Forwarded-For // X-Forwarded-For (csv list): Using the First entry in the list seems to work // for 99% of cases however it has been suggested that a better (although tedious) // approach might be to read each IP from right to left and use the first public IP. // http://.com/a/43554000/538763 // if (tryUseXForwardHeader) ip = GetHeaderValueAs<string>("X-Forwarded-For").SplitCsv().FirstOrDefault(); // RemoteIpAddress is always null in DNX RC1 Update1 (bug). if (ip.IsNullOrWhitespace() && _httpContextAccessor.HttpContext?.Connection?.RemoteIpAddress != null) ip = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString(); if (ip.IsNullOrWhitespace()) ip = GetHeaderValueAs<string>("REMOTE_ADDR"); // _httpContextAccessor.HttpContext?.Request?.Host this is the local host. if (ip.IsNullOrWhitespace()) throw new Exception("Unable to determine caller''s IP."); return ip; } public T GetHeaderValueAs<T>(string headerName) { StringValues values; if (_httpContextAccessor.HttpContext?.Request?.Headers?.TryGetValue(headerName, out values) ?? false) { string rawValues = values.ToString(); // writes out as Csv when there are multiple. if (!rawValues.IsNullOrWhitespace()) return (T)Convert.ChangeType(values.ToString(), typeof(T)); } return default(T); } public static List<string> SplitCsv(this string csvList, bool nullOrWhitespaceInputReturnsNull = false) { if (string.IsNullOrWhiteSpace(csvList)) return nullOrWhitespaceInputReturnsNull ? null : new List<string>(); return csvList .TrimEnd('','') .Split('','') .AsEnumerable<string>() .Select(s => s.Trim()) .ToList(); } public static bool IsNullOrWhitespace(this string s) { return String.IsNullOrWhiteSpace(s); }

Asume que _httpContextAccessor se proporcionó a través de DI.


obtener ipaddress y hostname en .net core

poner este código en el controlador

Sigue estos pasos:

[HttpGet] public string Get() { var remoteIpAddress = HttpContext.Connection.RemoteIpAddress; return remoteIpAddress.ToString(); }


var remoteIpAddress = HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress;