在运行时获取IIS绑定
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在运行时获取IIS绑定相关的知识,希望对你有一定的参考价值。
我想知道如何使用ASP.NET在运行时获取当前站点(主机名,端口,IP地址)的IIS绑定设置。 .NET是否提供了获取这些信息的方法?
编辑:我需要一种方法来将http和https端口配置为在从http切换到https时重定向到正确的端口,如果使用其他端口80/443则从https返回到http。没有扩展权限,有没有办法做到这一点?
问候
实现这一目标的唯一方法(不是管理员)是使用Microsoft.Web.Administration。我刚刚写了一篇关于如何做到这一点的快速博客,请参阅: http://blogs.msdn.com/b/carlosag/archive/2011/01/21/get-iis-bindings-at-runtime-without-being-an-administrator.aspx
基本上,由于IIS具有我们称为工作进程隔离的功能,因此可以从应用程序本身读取配置,而无需成为管理员。如果您使用ADSI,Metabase或任何其他方式,您将需要成为管理员。
您应该能够通过使用System.DirectoryServices程序集访问IIS元数据库来完成此操作。
例如,您可以在此处枚举这些站点中包含的所有站点和属性配置。
将此引用添加到项目中:
using System.DirectoryServices
// Assuming your Server Id is 1, and you are connecting to your local IIS.
DirectoryEntry de = new DirectoryEntry(@"IIS://localhost/W3SVC/1/Root");
foreach (DirectoryEntry entry in de.Children)
{
foreach (PropertyValueCollection property in entry.Properties)
{
Console.WriteLine("Name: {0}, Value {1}",property.PropertyName, property.Value);
}
}
我想你正在寻找元数据库访问:
您可以使用以下代码来获取绑定:
public static IEnumerable<Binding> GetSiteBindings(Site site)
{
BindingCollection bindings = site.Bindings;
if (bindings != null)
{
foreach (Binding binding in bindings)
{
if (binding != null)
{
yield return binding;
}
}
}
yield return null;
}
以下代码可用于测试上述方法:
ServerManager mgr = new ServerManager();
foreach (Site s in mgr.Sites)
{
Response.Write("Site: " + s);
Response.Write("<br/>");
var siteBindings = GetSiteBindings(s);
if (siteBindings != null)
{
foreach (var binding in siteBindings)
{
if (binding != null)
{
var bindingInformation = binding.BindingInformation;
var host = binding.Host;
var endPoint = binding.EndPoint;
Response.Write("Host: " + host + ", BindingInfo: " + bindingInformation + ", EndPoint: " + endPoint);
Response.Write("<br/>");
}
}
}
Response.Write("----------------------------------");
Response.Write("<br/>");
}
使用的命名空间:
<%@ Import Namespace="System.Diagnostics" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="Microsoft.Web.Administration" %>
大会参考:Microsoft.Web.Administration
将上面的代码放在Sample.aspx中进行测试:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Diagnostics" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="Microsoft.Web.Administration" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
ServerManager mgr = new ServerManager();
foreach (Site s in mgr.Sites)
{
Response.Write("Site: " + s);
Response.Write("<br/>");
var siteBindings = GetSiteBindings(s);
if (siteBindings != null)
{
foreach (var binding in siteBindings)
{
if (binding != null)
{
var bindingInformation = binding.BindingInformation;
var host = binding.Host;
var endPoint = binding.EndPoint;
Response.Write("Host: " + host + ", BindingInfo: " + bindingInformation + ", EndPoint: " + endPoint);
Response.Write("<br/>");
}
}
}
Response.Write("----------------------------------");
Response.Write("<br/>");
}
}
public static IEnumerable<Binding> GetSiteBindings(Site site)
{
BindingCollection bindings = site.Bindings;
if (bindings != null)
{
foreach (Binding binding in bindings)
{
if (binding != null)
{
yield return binding;
}
}
}
yield return null;
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="HtmlForm" runat="server">
<div>
</div>
</form>
</body>
</html>
会给你这样的输出:
以上是关于在运行时获取IIS绑定的主要内容,如果未能解决你的问题,请参考以下文章
用户运行托管 IIS 链接时如何在 asp.net 中获取客户端 IP 地址
我可以在IIS中更改证书指纹:使用PowerShell进行SSLBindings吗?