web-dev-qa-db-fra.com

Créer par programme un site Web en IIS en utilisant C # et définir le numéro de port

Nous avons pu créer un site Web. Nous l'avons fait en utilisant les informations de ce lien:

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

Cependant, nous aimerions utiliser un numéro de port autre que le port 80. Comment procéder?

Nous utilisons IIS 6

36
Shiraz Bhaiji

Si vous utilisez IIS 7, il existe une nouvelle API gérée appelée Microsoft.Web.Administration

Un exemple de l'article de blog ci-dessus:

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

Si vous utilisez IIS 6 et que vous voulez le faire, c'est plus complexe malheureusement.

Vous devrez créer un service Web sur chaque serveur, un service Web qui gère la création d'un site Web, car l'emprunt d'identité direct des utilisateurs sur le réseau ne fonctionnera pas correctement (si je me souviens bien).

Vous devrez utiliser Interop Services et faire quelque chose de similaire à ceci (cet exemple utilise deux objets, serveur et site, qui sont des instances de classes personnalisées qui stockent la configuration d'un serveur et d'un site):

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;

Voir plus ici

73
kitsune

Voici la solution.
Article de blog: Comment ajouter un nouveau site Web dans IIS 7

Cliquez sur le bouton:

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);
   }

Faire une boucle sur les sites si le nom existe déjà

    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;
    }
14
satinder singh

Essayez le code suivant pour connaître le port non utilisé

        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;
4
Hari

Je suis allé bien que tous répondent ici et ont également testé. Voici la version la plus intelligente de la réponse à cette question. Cependant, cela ne fonctionne toujours pas sur IIS 6.0. Donc IIS 8.0 ou supérieur est requis.

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;
}
2
Liakat Hossain
  1. Dans les propriétés du site, sélectionnez l'onglet "Site Web" et spécifiez TCP Port.
  2. En studio pour déboguer le but, spécifiez http: // localhost: <port>/<site & gt ; à l'onglet Web pour "Utiliser local IIS Web Server"
0
Dewfy