Programmatically create a web site in IIS using C# and set port number

前端 未结 5 926
春和景丽
春和景丽 2020-11-28 04:16

We have been able to create a web site. We did this using the information in this link:

https://msdn.microsoft.com/en-us/library/ms525598.aspx

However, we wo

相关标签:
5条回答
  • 2020-11-28 04:40

    If you're using IIS 7, there is a new managed API called Microsoft.Web.Administration

    An example from the above blog post:

    ServerManager iisManager = new ServerManager();
    iisManager.Sites.Add("NewSite", "http", "*:8080:", "d:\\MySite");
    iisManager.CommitChanges(); 
    

    If you're using IIS 6 and want to do this, it's more complex unfortunately.

    You will have to create a web service on every server, a web service that handles the creation of a website because direct user impersonation over the network won't work properly (If I recall this correctly).

    You will have to use Interop Services and do something similar to this (This example uses two objects, server and site, which are instances of custom classes that store a server's and site's configuration):

    string metabasePath = "IIS://" + server.ComputerName + "/W3SVC";
    DirectoryEntry w3svc = new DirectoryEntry(metabasePath, server.Username, server.Password);
    
    string serverBindings = ":80:" + site.HostName;
    string homeDirectory = server.WWWRootPath + "\\" + site.FolderName;
    
    
    object[] newSite = new object[] { site.Name, new object[] { serverBindings }, homeDirectory };
    
    object websiteId = (object)w3svc.Invoke("CreateNewSite", newSite);
    
    // Returns the Website ID from the Metabase
    int id = (int)websiteId;
    

    See more here

    0 讨论(0)
  • 2020-11-28 04:43

    Heres the solution.
    Blog article : How to add new website in IIS 7

    On Button click :

    try
     {
      ServerManager serverMgr = new ServerManager();
      string strWebsitename = txtwebsitename.Text; // abc
      string strApplicationPool = "DefaultAppPool";  // set your deafultpool :4.0 in IIS
      string strhostname = txthostname.Text; //abc.com
      string stripaddress = txtipaddress.Text;// ip address
      string bindinginfo = stripaddress + ":80:" + strhostname;
    
      //check if website name already exists in IIS
        Boolean bWebsite = IsWebsiteExists(strWebsitename);
        if (!bWebsite)
         {
            Site mySite = serverMgr.Sites.Add(strWebsitename.ToString(), "http", bindinginfo, "C:\\inetpub\\wwwroot\\yourWebsite");
            mySite.ApplicationDefaults.ApplicationPoolName = strApplicationPool;
            mySite.TraceFailedRequestsLogging.Enabled = true;
            mySite.TraceFailedRequestsLogging.Directory = "C:\\inetpub\\customfolder\\site";
            serverMgr.CommitChanges();
            lblmsg.Text = "New website  " + strWebsitename + " added sucessfully";
         }
         else
         {
            lblmsg.Text = "Name should be unique, " + strWebsitename + "  is already exists. ";
         }
       }
      catch (Exception ae)
      {
          Response.Redirect(ae.Message);
       }
    

    Looping over sites whether name already exists

        public bool IsWebsiteExists(string strWebsitename)
        {
            Boolean flagset = false;
            SiteCollection sitecollection = serverMgr.Sites;
            foreach (Site site in sitecollection)
            {
                if (site.Name == strWebsitename.ToString())
                {
                    flagset = true;
                    break;
                }
                else
                {
                    flagset = false;
                }
            }
            return flagset;
        }
    
    0 讨论(0)
  • 2020-11-28 04:43
    1. In properties of site select "Web Site" tab and specify TCP Port.
    2. In studio to debug purpose specify http://localhost:<port>/<site&gt; at tab Web for "Use Local IIS Web Server"
    0 讨论(0)
  • 2020-11-28 04:54

    Try the following Code to Know the unUsed PortNo

            DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC");
    
            // Find unused ID PortNo for new web site
            bool found_valid_port_no = false;
            int random_port_no = 1;
    
            do
            {
                bool regenerate_port_no = false;
                System.Random random_generator = new Random();
                random_port_no = random_generator.Next(9000,15000);
    
                foreach (DirectoryEntry e in root.Children)
                {
                    if (e.SchemaClassName == "IIsWebServer")
                    {
    
                        int site_id = Convert.ToInt32(e.Name);
                        //For each detected ID find the port Number 
    
                         DirectoryEntry vRoot = new DirectoryEntry("IIS://localhost/W3SVC/" + site_id);
                         PropertyValueCollection pvcServerBindings = vRoot.Properties["serverbindings"];
                         String bindings = pvcServerBindings.Value.ToString().Replace(":", "");
                         int port_no = Convert.ToInt32(bindings);
    
                         if (port_no == random_port_no)
                        {
                            regenerate_port_no = true;
                            break;
                        }
                    }
                }
    
                found_valid_port_no = !regenerate_port_no;
            } while (!found_valid_port_no);
    
            int newportId = random_port_no;
    
    0 讨论(0)
  • 2020-11-28 05:04

    I have gone though all answer here and also tested. Here is the most clean smarter version of answer for this question. However this still cant work on IIS 6.0. so IIS 8.0 or above is required.

    string domainName = "";
    string appPoolName = "";
    string webFiles = "C:\\Users\\John\\Desktop\\New Folder";
    if (IsWebsiteExists(domainName) == false)
    {
        ServerManager iisManager = new ServerManager();
        iisManager.Sites.Add(domainName, "http", "*:8080:", webFiles);
        iisManager.ApplicationDefaults.ApplicationPoolName = appPoolName;
        iisManager.CommitChanges();
    }
    else
    {
        Console.WriteLine("Name Exists already"); 
    }
    
    
    public static bool IsWebsiteExists(string strWebsitename)
    {
        ServerManager serverMgr = new ServerManager();
        Boolean flagset = false;
        SiteCollection sitecollection = serverMgr.Sites;
        flagset = sitecollection.Any(x => x.Name == strWebsitename);
        return flagset;
    }
    
    0 讨论(0)
提交回复
热议问题