如何使用C#获取IIS中网站的“浏览”URL?

10

假设我在IIS中有一个名为“站点名称”的网站。我可以通过C#代码中的ServerManager类访问大部分功能。但我似乎无法弄清如何获取它的“浏览”URL,就像我在下面截图中所示的那样?

enter image description here

如果我在中进入“管理网站”->“浏览”,它将使用以下URL启动IE:

http://localhost:8080/app1/Default.aspx

所以我需要获取像那样的URL。

附注:请注意,我不需要启动网站本身。


1
通过查询此网站的绑定,您可以获取主机名和端口号。但是,由于您粘贴的URL不是原始URL,因此您无法获得其余部分。 app1和Default.aspx通常来自后续重定向和默认文档扩展,只有启动该网站才能获取它们。 - Lex Li
4个回答

1

试试这个:

using (Microsoft.Web.Administration.ServerManager sm = Microsoft.Web.Administration.ServerManager.OpenRemote("localhost"))
{
    int counter = 0;
    string[] ipAddress = new string[10];
    string[] sites = new string[10];
    List<Tuple<string, string>> mylist = new List<Tuple<string, string>>();

    foreach (var site in sm.Sites)
    {
        sites[counter] = site.Name;

        foreach(var bnd in site.Bindings)
            ipAddress[counter] = bnd.EndPoint != null ? 
                bnd.EndPoint.Address.ToString() : String.Empty;

        mylist.Add(Tuple.Create(sites[counter], ipAddress[counter]));
                counter++;                    
    }
}

请注意,这个“foreach(var bnd in site.Bindings)”只会添加找到的最后一个端点。 - SwissCoder

1
右键单击并转到“主机名”下的“编辑绑定...”,您可以实际上看到它属于哪个域名。
或者
单击站点,在右侧的操作选项卡上单击“绑定...”
获取URL:
HttpContext.Current.Request.Url.AbsoluteUri;
//http://localhost:8080/app1/Default.aspx

HttpContext.Current.Request.Url.AbsolutePath;
// /YourSite/app1/Defaul.aspx

HttpContext.Current.Request.Url.Host;
// localhost:8080

编辑:

如需获取站点信息,请尝试使用 HostingEnvironment.ApplicationHost.GetSiteName()HostingEnvironment.ApplicationHost.GetSiteID(),请参见以下示例(未经测试):

using (ServerManager sm = new ServerManager())
{
    foreach (Binding b in sm.Sites[HostingEnvironment.ApplicationHost.GetSiteName()].Bindings)
    {
        // ...
    }     
}

0

这是获取浏览器URL的一种方式

ServerManager serverMgr = new ServerManager();
Site site = serverMgr.Sites["YourSiteName"];
List<string[]> urls = new List<string[]>();
foreach (Binding binding in site.Bindings)
{
    string bindingInfo = binding.BindingInformation;
    string subString = bindingInfo.Substring(2, bindingInfo.Length - 2);
    string[] adrs = subString.Split(':');
    adrs[0] = "localhost:" + adrs[0];
    urls.Add(adrs);
}

0

JexusManager现在是开源的,因此您可以检查其Binding.ToUri方法的实现。

https://github.com/jexuswebserver/Microsoft.Web.Administration/blob/master/Microsoft.Web.Administration/Binding.cs

        internal string ToUri()
        {
            var address = EndPoint.Address.Equals(IPAddress.Any)
                ? Parent.Parent.Parent.Parent.HostName.ExtractName()
                : EndPoint.AddressFamily == AddressFamily.InterNetwork
                    ? EndPoint.Address.ToString()
                    : string.Format("[{0}]", EndPoint.Address);
            return IsDefaultPort
                ? string.Format("{0}://{1}", Protocol, address)
                : string.Format("{0}://{1}:{2}", Protocol, address, EndPoint.Port);
        }

由于Microsoft的MWA不公开HostName部分,因此您必须用等效的东西替换它(由于您是初始化ServerManager的人,所以您应该知道主机名是什么)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接