Вопрос по iis-6, iis, c#, port – Программно создать веб-сайт в IIS с использованием C # и установить номер порта

34

Мы смогли создать веб-сайт. Мы сделали это, используя информацию в этой ссылке:

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

Тем не менее, мы хотели бы использовать номер порта, отличный от порта 80. Как мы это делаем?

Мы используем IIS 6

Мы используем IIS 6 Shiraz Bhaiji
Какую версию IIS вы используете? kitsune
@Wael Добавьте веб-сайт в IIS и одновременно укажите номер порта этого веб-сайта. Shiraz Bhaiji
Вы хотите указать порт при настройке или хотите добавить сайт в IIS по коду? Wael Dalloul

Ваш Ответ

5   ответов
72

Если ты'с использованием IIS 7 появился новый управляемый APIMicrosoft.Web.Administration

Пример из приведенного выше сообщения в блоге:

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

Если ты'использую IIS 6 и хочу сделать этоСложнее, к сожалению.

Вам нужно будет создать веб-сервис на каждом сервере, веб-сервис, который обрабатывает создание веб-сайта, потому что прямое олицетворение пользователя по сети выиграло ».не работает должным образом (если я правильно помню это).

Вам нужно будет использовать Interop Services и сделать что-то похожее на это (в этом примере используются два объекта, сервер и сайт, которые являются экземплярами пользовательских классов, хранящих сервер).с и сайтконфигурация):

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;

Узнать большеВот

Спасибо, к сожалению, мы используем IIS 6. Shiraz Bhaiji
Отлично ... кстати, следите за пулами приложений ... может потребоваться дополнительная настройка ... kitsune
Благодарю. Второй набор кода, который вы разместили, сработал. Shiraz Bhaiji
Я сделал это в устаревшем проекте обслуживания, яПосмотрим, смогу ли я найти код. Это'довольно загадочно и запутанно, к сожалению. kitsune
13

Вот решение.

Статья в блоге: Как добавить новый сайт в IIS 7

При нажатии кнопки:

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

Цикл по сайтам, если имя уже существует

    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;
    }
-1 для венгерской нотации Adam Drewery
@LiakatHossain Хотя я предпочитаю твой лямбда-стиль, это точно такая же логика. batpox
@AdamDrewery Не полезно. Где он работает, может потребоваться. batpox
Только для IIS7. Не удается найти ссылку на IIS6. Piotr Kula
Чтобы проверить IsWebsiteExists, пожалуйста, смотрите мой ответ. Это может быть более разумным способом Liakat Hossain
4

Попробуйте следующий код, чтобы узнать неиспользуемый номер порта

        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;
1

Я пошел, хотя все ответы здесь и также проверил. Вот самый чистый и умный вариант ответа на этот вопрос. Однако это все еще не может работать на IIS 6.0. поэтому IIS 8.0 или выше требуется.

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
В свойствах сайта выберите "Веб-сайт" и укажите TCP-порт.В студии для отладки цели уточняйтеHTTP: // локальный: <порт> / <сайт &GT; на вкладке Веб для "Использовать локальный веб-сервер IIS "
Можете ли вы использовать wmi поверх JScript или VBScript? Dewfy
Спасибо за ваш ответ. Но это то, как вы делаете это с помощью пользовательского интерфейса, мне нужно знать, как это сделать в коде. Shiraz Bhaiji

Похожие вопросы