主机名有时是空的

时间:2016-09-30 01:28:35

标签: asp.net .net vb.net

在我的一个应用程序(ASP.NET / VB.NET)中,我需要读取客户端计算机名称。基于客户端计算机,我们触发销售点支付设备以接受付款。在这些系统中的每一个上,我们都安装了一个独立的软件,它使用HTTP请求与银行进行通信。我使用以下.NET代码来读取客户端计算机名称。

Dim name As String = String.Empty
Dim hostEntry = Dns.GetHostEntry(HttpContext.Current.Request.UserHostAddress)
If hostEntry.HostName.Contains(".") Then
    name = hostEntry.HostName.Substring(0, hostEntry.HostName.IndexOf("."))
Else
    name = hostEntry.HostName.Trim
End If

在开发环境中,我们所有的系统都在一个域中(" xyz.com"),我们没有任何问题。在客户位置,他们没有域名设置。我的上述逻辑在客户端环境中的某些系统中运行良好,并且能够进行支付,但在大多数系统中,我们的逻辑失败并且无法读取主机名。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

您的问题没有回答问题所需的详细信息。关于两种环境,有许多问题需要回答,以给出正确的答案。由于我不能提问,我会做出一些假设,这些假设可能适用于这篇文章的未来读者,并能够帮助他们。

我会问一个问题,但我的个人资料是因为一些未知原因而分叉的,我没有提出问题所需的声誉。话虽如此,我将浏览一系列我可以识别出来的问题并为问题提出解决方案,希望能引导您找到解决方案。

所以......

1)您声明需要读取客户端计算机名称。但是,如果您的应用程序未在内部LAN(也称为Intranet)上运行,则无法读取客户端计算机名称时间段。所以这可能是你的第一个问题。

2)组合点1并假设您正在从客户端的UserHostAddress读取IP地址以查找DNS主机名,并且当主机查找成功时,您将获取名称的第一部分,直到第一个“ “。假设这是一个在开发环境和客户端环境中在LAN上运行的Intranet应用程序,应该是安全的。根据该假设并给出所有机器都被赋予xyz.com域的声明,可以假设您的开发环境中的DNS正在通过Active Directory(AD)进行动态更新。在这种情况下,只要开发网络上的客户端机器请求IP地址(可能是通过AD),与AD集成的DHCP服务器就会发出新的IP地址。当它确实并且DHCP提供被客户端AD确认并接受时,通过添加具有指向IP地址的客户端机器的计算机名称的主机条目来更新DNS(在Windows网络上也是AD集成的)。此外,DNS指针(取决于配置)可以添加到AD的DNS中,该DNS允许IP地址查找解析到记录(在这种情况下将是客户端的计算机名称)。因此,使用您的开发环境(可能在Windows Active Directory域上运行)一切正常。 Addi tonally,默认情况下,顶级域名(XYZ.COM)会在客户端的初始DNS请求中附加到客户端计算机名称。

3)您的客户端没有运行域,这会留下更多问题。他们在跑窗吗?如果他们正在运行Windows,则将其作为非广告环境,例如工作组。第一个假设是它们不是AD集成的,否则你很可能不会遇到这个问题,尽管我可以想到一些罕见的情况。但是,可能性相关的问题是它们运行的​​DNS服务器是什么以及它们运行的​​DHCP服务器是什么?您的应用程序正在尝试在其网络上使用客户端IP地址,并且基于其IP的主机名称查找失败,因此它在其环境中告诉我由于某种原因您无法从IP地址获取主机名客户。请注意,如果他们可以在AD上并且完全正确配置他们的DNS服务器只是不堪重负并且在2秒内没有响应导致名称查找失败,但这是速率情况。有了更多信息,我可以提供更多帮助。

3)假设在2中它们不在AD上,您是否能够在运行应用程序的计算机上手动编写主机名?例如,假设yourapp.exe运行client-server-01并且客户端连接到它。然后在client-server-01上,您可以在主机文件中为您希望连接的客户端网络上的每台PC添加静态DNS条目。另一方面,如果您的应用程序在客户端PC上本地运行,您可以将机器名称作为Web请求中的标头传递,然后从服务器上的Request.Headers变量中读取它。

4)再次,做出另一个假设,客户端是基于Web的,客户端环境中的应用程序正在服务器上托管......服务器是否位于客户端环境之外的DMZ上?如果是这样,根据最佳实践,可能会根据最佳实践配置客户端环境,即服务器托管您的Web应用程序位于DMZ中,并且对该框的DNS请求将转发到客户端的ISP,而不会返回到具有DNS服务器能力的网络中将内部IP解析为客户端计算机名称。如果是这种情况,您需要将客户端计算机名称作为变量从客户端或代码本地IP发送到服务器主机文件中的主机名(假设内部网络不在NAT后面并暴露真实客户端计算机的IP)或请求DMZ服务器可以访问内部DNS并相应地配置访问权限。

...

这个清单一直在继续,但我认为我突出了99%的情况并为各种解决方案提供了答案。

答案 1 :(得分:0)

您可以尝试从X-Forwarded-For标题

中删除它
  

X-Forwarded-For(XFF)HTTP头字段是一种常用方法   识别连接到Web的客户端的原始IP地址   服务器通过HTTP代理或负载均衡器。

这是X-Forwarded-For应该返回的内容:

  

X-Forwarded-For:client,proxy1,proxy2

这里有一些示例代码:

string ip = Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ;
if (!string.IsNullOrEmpty(ip))
{
   string[] ipRange = ip.Split(',');
   ip = ipRange[0];
}
else
{
   ip = Request.ServerVariables["REMOTE_ADDR"];
}

答案 2 :(得分:0)

客户端计算机上的防火墙设置存在问题。由于我们的.NET代码失败了。为来自xyz.com的所有传入请求添加例外。我的代码没有任何问题。

谢谢你们@Alexander Higgins,@ halfer的帮助。