本帖最后由 Eric.Liang 于 2020-10-10 11:19 编辑
之前有好几位格友都问过我在活字格中如何获取局域网内网IP。当然,为了方便大家的时候我们提供了JS获取内网IP,用来实现限制IP登录的功能。
但是,前一段时间突然有人反映,升级新版本活字格之后IP获取不成功,JS会报错,导致系统逻辑出了问题。
我们也在自己的机器测试,并没有复现,客户装回原始的版本,依然会报错,但是由于我们复测不出来具体的效果,导致无法排查问题。客户自己在排查过程中发现重装win7系统后正常,但是微软补丁升级后就无法继续使用了。这让我一度怀疑微软的补丁和JS获取局域网IP有一定的冲突。
因此,本教程我直接放弃使用前端代码获取局域网ip,改用C#服务器端代码获取局域网IP,达到一步到位的效果。
目前服务器端代码中我直接是获取了ipv4的局域网IP,返回到前端,可以在前端通过JS代码去操作。
C#代码
- using GrapeCity.Forguncy.ServerApi;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Text;
- using System.Threading.Tasks;
- namespace getLanIP
- {
- public class Class1:ForguncyApi
- {
- [Post]
- public void getLanIP()
- {
- List<string> ipv4_ips = GetLocalIpAddress("InterNetwork");
- this.Context.Response.Write(ipv4_ips[0]);
- }
- /// <summary>
- /// 获取本机所有ip地址
- /// </summary>
- /// <param name="netType">"InterNetwork":ipv4地址,"InterNetworkV6":ipv6地址</param>
- /// <returns>ip地址集合</returns>
- public static List<string> GetLocalIpAddress(string netType)
- {
- string hostName = Dns.GetHostName(); //获取主机名称
- IPAddress[] addresses = Dns.GetHostAddresses(hostName); //解析主机IP地址
- List<string> IPList = new List<string>();
- if (netType == string.Empty)
- {
- for (int i = 0; i < addresses.Length; i++)
- {
- IPList.Add(addresses[i].ToString());
- }
- }
- else
- {
- //AddressFamily.InterNetwork表示此IP为IPv4,
- //AddressFamily.InterNetworkV6表示此地址为IPv6类型
- for (int i = 0; i < addresses.Length; i++)
- {
- if (addresses[i].AddressFamily.ToString() == netType)
- {
- IPList.Add(addresses[i].ToString());
- }
- }
- }
- return IPList;
- }
- }
- }
复制代码
前端JS代码(res为返回的内网IP信息,这里弹出了内网IP)
- //发送请求到服务器
- Forguncy.Helper.post("customapi/class1/getLanIP", null, function (res) {
- alert(res);
- });
复制代码
具体使用见下方:
1.针对C#工程文件进行编译
2.在该C#工程文件的文件夹中找到bin/release/对应方法的dll
3.在活字格设计器中上传2中的dll
4.在页面中对该dll的post方法进行调用
从而达到获取局域网IP的逻辑。
工程文件见附件
|