0

我有一个包含 URL 的变量。

string url;

它可能包含环回主机名。例如,它的值可能如下:

http://localhost/x

我想确保该 URL 可以从可以访问当前计算机的另一台计算机上使用。如果它是一个环回 URL,这将不起作用。

例如,如果当前计算机的域名是webserver.company.local,我如何以编程方式替换环回 URL 的主机名这个值?

请注意,这是针对 ASP.NET 应用程序的,但我也对通用解决方案感兴趣。

4

1 回答 1

1

解决此问题的一种方法是执行以下步骤:

  1. 确定 URL 是否为环回。如果是这样,请继续。一种方法是使用Uri.IsLoopback.
  2. 确定当前计算机的 DNS 主机名。这可以使用静态Dns类来完成。
  3. 将 URL 的主机名部分替换为当前计算机的主机名部分。这可以使用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

在 ASP.NET 响应的上下文中,我认为当前计算机的主机名可能不一定与请求者使用的主机名相同。此外,计算机可能有多个不同的关联主机名。因此,从HTTP 请求的 URL获取主机名似乎适合我。修改上述实现以使用此主机名:

/*Get HTTP request*/.Url.Host
于 2013-06-13T04:10:57.387 回答