Динамически создавать веб-сайт в IIS, используя Asp. net web C# - PullRequest
1 голос
/ 09 июля 2020

Мы сослались на stackOverflow и несколько других сайтов для создания веб-сайта на IIS с помощью консольного приложения. Это сработало после того, как мы запустили консоль с разрешением администратора. Код действительно создает пул приложений и хост-сайт на заданном порту. Тот же код, когда мы пробовали веб-приложение asp. net, он завершил свое выполнение, но мы не нашли метаданных в IIS.

Вот код, который работает на консоли ..

 try
 {
     ServerManager server = new ServerManager();

     ApplicationPool myApplicationPool = null;

     
     //we will first check to make sure that this pool does not already exist
     //since the ApplicationPools property is a collection, we can use the Linq FirstOrDefault method
     //to check for its existence by name
     if (server.ApplicationPools != null && server.ApplicationPools.Count > 0)
     {
         if (server.ApplicationPools.FirstOrDefault(p => p.Name == "TestPool") == null)
         {
             //if the pool is not already there we will create it
             myApplicationPool = server.ApplicationPools.Add("TestPool");

         }
         else
         {
             //if we find the pool already there, we will get a referecne to it for update
             myApplicationPool = server.ApplicationPools.FirstOrDefault(p => p.Name == "TestPool");
         }
     }
     else
     {
         //if the pool is not already there we will create it
         myApplicationPool = server.ApplicationPools.Add("TestPool");
     }

     if (myApplicationPool != null)
     {
         //for this sample, we will set the pool to run under the NetworkService identity
         myApplicationPool.ProcessModel.IdentityType = 
         ProcessModelIdentityType.NetworkService;

         //for this sample, we will set the pool to run under the identity of a specific user
         //myApplicationPool.ProcessModel.IdentityType = 
         ProcessModelIdentityType.SpecificUser;
         //myApplicationPool.ProcessModel.UserName = UserName;
         //myApplicationPool.ProcessModel.Password = Password;


         //we set the runtime version
         myApplicationPool.ManagedRuntimeVersion = "v4.0";

         //we save our new ApplicationPool!
         server.CommitChanges();
     }

     //Create website
     if (server.Sites != null && server.Sites.Count > 0)
     {
         //we will first check to make sure that the site isn't already there
         if (server.Sites.FirstOrDefault(s => s.Name == "MySite") == null)
         {
             //we will just pick an arbitrary location for the site
             string path = @"C:\inetpub\Custom";

             //we must specify the Binding information
             string ip = "*";
             string port = "98";
             string hostName = "*";

             string bindingInfo = string.Format(@"{0}:{1}:{2}", ip, port, hostName);

             //add the new Site to the Sites collection
             Site site = server.Sites.Add("MySite", "http", bindingInfo, path);

            //set the ApplicationPool for the new Site
            site.ApplicationDefaults.ApplicationPoolName = myApplicationPool.Name;

            //save the new Site!
            server.CommitChanges();
            Console.WriteLine("Web site created successfully...");
            Console.ReadLine();
        }
    }
}
catch (Exception ex)
{

   Console.WriteLine(ex.Message);
   Console.ReadLine()
}

Здесь сайт также указан в IIS. введите описание изображения здесь

Теперь, когда тот же код используется в веб-приложении, он ничего не создает в IIS. Когда мы проверяли объект диспетчера серверов, мы обнаружили, что список пула приложений был получен из файла проекта

applicationhost.config

, который находится в скрытой папке .vs.

Мы установили последнюю версию IIS на локальный компьютер для тестирования, есть ли какие-либо изменения, необходимые для его работы в Интернете. (: мы новички в материалах IIS)

1 Ответ

2 голосов
/ 10 июля 2020

Вы можете попробовать следующий код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Web.Administration;

namespace IISTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {

                Console.WriteLine("Do you want to create an Application Pool:y/n");
                string response = Console.ReadLine();
                if (response.ToString() == "y")
                {
                    Console.Write("Please enter Application Pool Name:");
                    string poolname = Console.ReadLine();
                    bool isEnable32bit = false;
                    ManagedPipelineMode mode = ManagedPipelineMode.Classic;
                    Console.Write("Need to enable 32 bit on Windows 64 bit?y/n [Applicable for 64 bit OS]: y/n?");
                    string enable32bit = Console.ReadLine();
                    if (enable32bit.ToLower() == "y")
                    {
                        isEnable32bit = true;
                    }
                    Console.Write("Please select Pipeline Mode: 1 for Classic, 2 for Integrated:");
                    string pipelinemode = Console.ReadLine();
                    if (pipelinemode.ToLower() == "2")
                    {
                        mode = ManagedPipelineMode.Integrated;
                    }
                    Console.Write("Please select Runtime Version for Application Pool: 1 for v2.0, 2 for v4.0:");
                    string runtimeVersion = Console.ReadLine() == "1" ? "v2.0" : "v4.0";

                    CreateAppPool(poolname, isEnable32bit, mode, runtimeVersion);
                    Console.WriteLine("Application Pool created successfully...");
                }
                Console.WriteLine("Do you want to create a website:y/n");
                response = Console.ReadLine();
                if (response.ToString() == "y")
                {
                    Console.Write("Please enter website name:");
                    string websiteName = Console.ReadLine();
                    Console.Write("Please enter host name:");
                    string hostname = Console.ReadLine();
                    Console.Write("Please enter physical path to point for website:");
                    string phypath = Console.ReadLine();
                    Console.WriteLine("Application pool Name:");
                    foreach (var pool in new ServerManager().ApplicationPools)
                    {
                        Console.WriteLine(pool.Name);
                    }
                    Console.WriteLine("");
                    Console.Write("Please enter Application pool Name for web site:");
                    string poolName = Console.ReadLine();
                    CreateIISWebsite(websiteName, hostname, phypath, poolName);
                    Console.WriteLine("Web site created successfully...");
                    Console.ReadLine();
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }
        }
        private static void CreateIISWebsite(string websiteName, string hostname, string phyPath, string appPool)
        {
            ServerManager iisManager = new ServerManager();
            iisManager.Sites.Add(websiteName, "http", "*:80:" + hostname, phyPath);
            iisManager.Sites[websiteName].ApplicationDefaults.ApplicationPoolName = appPool;

            foreach (var item in iisManager.Sites[websiteName].Applications)
            {
                item.ApplicationPoolName = appPool;
            }

            iisManager.CommitChanges();
        }
        private static void CreateAppPool(string poolname,bool enable32bitOn64, ManagedPipelineMode mode,string runtimeVersion="v4.0")
        {
            using (ServerManager serverManager = new ServerManager())
            {
                ApplicationPool newPool = serverManager.ApplicationPools.Add(poolname);
                newPool.ManagedRuntimeVersion = runtimeVersion;
                newPool.Enable32BitAppOnWin64 = true;
                newPool.ManagedPipelineMode = mode;
                serverManager.CommitChanges();
            }
        }
    }
}

Примечание: не забудьте добавить ссылку на Microsoft.Web.Administration.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...