通过代码给IIS增加主机头

看了一醉解千愁修改IIS目录的Asp.Net版本之后,想到以前想过要通过代码给IIS增加主机头,却一直没去研究,今天趁着兴趣,决定把这个问题解决了。
     对于Blog网站,如果需要为用户提供二级域名支持,而Web程序不是运行默认站点中,就需要在用户注册时通过代码给IIS增加相应的主机头。
     这个问题是通过Google搜索到Append a host header by code in IIS解决的,经过测试,确认方法可行并对代码进行了一些改进后,考虑到这个内容会给一些朋友带来帮助,于是就写了这篇文章。
     代码如下:
    
        static void Main(string[] args)
        {
            AddHostHeader(1, null, 80, "test.cnblogs.com");        
        }

        static void AddHostHeader(int siteid,string ip, int port, string domain)
        {
            DirectoryEntry site = new DirectoryEntry("IIS://localhost/W3SVC/"+siteid);
            PropertyValueCollection serverBindings = site.Properties["ServerBindings"];
            string headerStr = string.Format("{0}:{1}:{2}",ip,port,domain);
            if (!serverBindings.Contains(headerStr))
            {
                serverBindings.Add(headerStr);
            }
            site.CommitChanges();
        }

     在找到Append a host header by code in IIS之前,我通过下面的代码没找到"ServerBindings"属性,走了一些弯路。

DirectoryEntry site = new DirectoryEntry("IIS://localhost/W3SVC/1/root");

     代码很简单,需要说明的是siteid,默认站点是1,对于非默认站点,通过查看站点日志文件名就可以知道。
posted @ 2006-03-25 21:08 dudu 阅读(1905) 评论(8)  编辑 收藏

  回复  引用    
#1楼 2006-03-29 14:43 | 潇笑 [未注册用户]
  晕,用户多了的话要建多少?
  回复  引用    
#2楼 2006-04-02 03:09 | 家伟 [未注册用户]
dudu老大您好,我尝试在注册的时候,根据用户提交的USERNAME来往IIS里写入主机头,但是失败了。应该是写权限的问题,我不知道该怎么设置才能成功,错误信息如下,还请您抽空帮忙解答下,另外,如果主机头过多,比如上万,会不会影响性能?
拒绝访问。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.UnauthorizedAccessException: 拒绝访问。

ASP.NET 未被授权访问所请求的资源。请考虑授予 ASP.NET 请求标识访问此资源的权限。ASP.NET 有一个在应用程序没有模拟时使用的基进程标识(通常,在 IIS 5 上为 {MACHINE}\ASPNET,在 IIS 6 上为网络服务)。如果应用程序正在通过 <identity impersonate="true"/> 模拟,则标识将为匿名用户(通常为 IUSR_MACHINENAME)或经过身份验证的请求用户。

若要授予 ASP.NET 对文件的写访问权,请在资源管理器中右击该文件,选择“属性”,然后选择“安全”选项卡。单击“添加”添加适当的用户或组。突出显示 ASP.NET 帐户,选中所需访问权限对应的框。

源错误:


行 36: //try
行 37: //{
行 38: site.CommitChanges();
行 39: //}
行 40: //catch(Exception ex)


  回复  引用    
#3楼 2006-04-02 03:39 | 家伟 [未注册用户]
我对IIS LOGFILES 目录给aspnet 用户以写权限后错误依旧,望解答
  回复  引用  查看    
#4楼 2006-04-03 23:49 | Leonic      
其实siteid就是DirectoryEntry 对象的Name属性,可以这样访问的到:

DirectoryEntry v_DirectoryEntryParent = new DirectoryEntry("IIS://localhost/W3SVC");
foreach(DirectoryEntry t_domain in v_DirectoryEntryParent.Children)
{
if (t_domain.SchemaClassName == "IIsWebServer")
{
Console.WriteLine("The name is: {0}\n", t_domain.Name);
}
}

  回复  引用  查看    
#5楼 2006-04-12 00:41 | leejia      
通过WEB的方式好像没权限增删主机头,望解答
  回复  引用    
#6楼 2006-07-15 16:23 | 随风倒 [未注册用户]
@leejia
装组件吧
  回复  引用    
#7楼 2007-04-16 15:24 | 王国栋 [未注册用户]
这个代码真漂亮,支持大哥!收藏了
  回复  引用  查看    
#8楼 2008-06-26 03:23 | JoyBin      
DUDU老大。。我也碰到了和 2楼 同样的问题。。

请你一定要帮帮我啊。。我都找了一天的问题了。。

哎。。

我的email是 cooolbin@163.com

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-04-02 22:32 编辑过


相关链接: