2

我有一个对我的 web api 控制器的 JavaScript ajax 调用。当他们拨打电话时,我需要获取他们的 wan ip 地址。

我已经看到了很多 MVC 示例,但我使用的是 asp.net 核心,并且那里的方法不起作用。值始终为空。

这是js:

 $.ajax({
    url: "/my server ip",
    type: "POST",
    contentType: "application/json; charset=utf-8",
    headers: { 'Content-Type': 'application/json' },
    success: function (data) { 
         $("#DeviceIp").html(data.ip + " " + data.wanIp);
            }
        });

我的 API:

    IActionContextAccessor accessor

    _accessor = accessor;


    [HttpPost]
    [Route("Account/GetDeviceIp")]
    public IpStats GetDeviceIp()
    {
        var WanIp = _accessor.ActionContext.HttpContext.Request.Headers.ToString();
    }

注意

我应该这样说:

_accessor.ActionContext.HttpContext.Connection.RemoteIpAddress.ToString()

给了我空。另一种方法不为空,但该对象上没有 wanip 地址...

我使用的是 nginx 而不是 IIS

4

1 回答 1

2

常规 .NET Core 2.2 Web Api 控制器中的以下操作适用于我:

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

但是,您提到您使用的是 nginx(我假设为反向代理),这改变了从哪里获取 IP 地址信息。当我们使用反向代理时,代理需要将客户端的 IP 地址放在一个 HTTP 头 X-Forwarded-For 中,那么你的应用程序应该能够看到客户端的真实 IP 地址:

// using Microsoft.AspNetCore.HttpOverrides;

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

因此,请确保按照使用 nginx 在 Linux 中托管 .NET Core 中所述设置 X-Forwarded-For 标头(配置 nginx 部分),本教程涵盖了您需要的所有基本设置。

于 2020-06-27T20:45:13.033 回答