我有一个包含 URL 的变量。
string url;
它可能包含环回主机名。例如,它的值可能如下:
http://localhost/x
我想确保该 URL 可以从可以访问当前计算机的另一台计算机上使用。如果它是一个环回 URL,这将不起作用。
例如,如果当前计算机的域名是webserver.company.local
,我如何以编程方式替换环回 URL 的主机名这个值?
请注意,这是针对 ASP.NET 应用程序的,但我也对通用解决方案感兴趣。
解决此问题的一种方法是执行以下步骤:
Uri.IsLoopback
.Dns
类来完成。UriBuilder
.鉴于此方法签名:
Uri MakeExternallyUsable(Uri uri)
以下是实现预期结果的两种实现:
Dns.GetHostName
可用于获取可能完全限定的主机名。但是,我认为使用完全限定的主机名会更加健壮。此答案中建议了一种执行此操作的机制。
如果您使用这种方法,请务必考虑所需的权限和可能的例外情况。
if (uri.IsLoopback)
{
var builder = new UriBuilder(uri)
{
Host = Dns.GetHostEntry("LocalHost").HostName
};
return builder.Uri;
}
else
return uri;
在 ASP.NET 响应的上下文中,我认为当前计算机的主机名可能不一定与请求者使用的主机名相同。此外,计算机可能有多个不同的关联主机名。因此,从HTTP 请求的 URL获取主机名似乎适合我。修改上述实现以使用此主机名:
/*Get HTTP request*/.Url.Host