获取出口ip or api获取请求者ip

艾玛,这两天为了整这个ip 真的可谓无所不用其极。

在网上查阅了各种资料,其实我想实现的功能很简单

就像百度

直接看到自己的出口ip

奈何查了许多资料,都没有适合的解决办法。

灵机一动,我是不是可以访问百度的api呢?

于是点击了上面的Ip地址查询,跳转到了  http://www.ip138.com/

然后我试着在显示Ip的地方,查看元素

惊喜来了

原来它是套了一个iframe

把  iframe 的地址那出来  http://2018.ip138.com/ic.asp

直接返回ip地址和所在地。

接着对返回数据进行解析

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static string getExternalIp()
        {
            try
            {
                WebClient client = new WebClient();
                client.Encoding = System.Text.Encoding.Default;
                string response = client.DownloadString("http://2018.ip138.com/ic.asp");
                string myReg = @"<center>([\s\S]+?)<\/center>";
                Match mc = Regex.Match(response, myReg, RegexOptions.Singleline);
                if (mc.Success && mc.Groups.Count > 1)
                {
                    var resStart = mc.Groups[1].Value.IndexOf('[');
                    var resEnd = mc.Groups[1].Value.IndexOf(']');
                    var resSub = mc.Groups[1].Value.Substring(resStart + 1, resEnd - resStart - 1);
                    response = resSub;
 
                    return response;
                }
                else
                {
                    return "0.0.0.0";
                }
            }
            catch (Exception)
            {
                return "0.0.0.0";
            }
        }

  完美,是不是大功告成?

可是在测试的途中发现有时候依然会失败,返回数据为 "0.0.0.0"

于是我又加了一个定时器

1
2
3
4
5
GetAddressIP();
           if (!this.lblIp.Content.ToString().Equals("0.0.0.0"))
           {
               selectIp.Stop();
           }

  每一秒去取一次Ip,直到取到为止

当然我觉得这都不是最好的办法

可是转念一想,为什么我们不自己写一个获取请求者的Ip的接口呢?

在这里我得感谢一个人

老六代码

多亏有了这位大哥的帮忙,才让我得已在 .net core api 下面成功拿到了请求者的Ip

初始化时

1
2
3
4
5
services.AddMvc();
         services.Configure<IISOptions>(options =>
         {
             options.ForwardClientCertificate = false;
         });

  然后接口这里

1
2
3
4
5
6
7
8
9
10
11
12
13
private IHttpContextAccessor _accessor;
 
public Controller(IHttpContextAccessor accessor)
       {
           this._accessor = accessor;
       }
 
[HttpPost, Route("GetIp")]
       public ActionResult<string> GetIp()
       {
           var ip = _accessor.HttpContext.Connection.RemoteIpAddress;
           return ip.ToString();
       }

  因为我是.net core 的缘故。所以用到了IHttpContextAccessor

我想如果是普通的api 应该直接就可以用Request 吧,就像老六大哥说的那样~

 

posted @   临冰听雪丶  阅读(1704)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示