简体   繁体   English

使用 Asp.net web ZD7EFA19FBE7D3972FD5ADB6024223D74 在 IIS 上动态创建网站

[英]Dynamically create website on IIS using Asp.net web C#

We referred stackOverflow and a few other sites to create a website on IIS using console application.我们参考了stackOverflow和其他一些站点,使用控制台应用程序在 IIS 上创建了一个网站。 It worked after we run the console with administration permission.在我们以管理权限运行控制台后,它就起作用了。 Code does create an Application pool and host site on a given port.代码确实在给定端口上创建了一个应用程序池和主机站点。 Same code when we tried on asp.net web application it completed its execution but we did not found metadata on IIS.当我们在 asp.net web 应用程序上尝试相同的代码时,它完成了执行,但我们没有在 IIS 上找到元数据。

Here is a code that works on console..这是在控制台上工作的代码..

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

Here site gets listed in IIS as well.这里的站点也列在 IIS 中。 在此处输入图像描述

Now when tried the same code on the web application, it does not create anything on IIS.现在,当在 web 应用程序上尝试相同的代码时,它不会在 IIS 上创建任何内容。 when we inspect the server manager object we found that the Application pool list was coming from the project's当我们检查服务器管理器 object 时,我们发现应用程序池列表来自项目的

applicationhost.config应用程序主机配置

file which is located on.vs hidden folder.位于.vs 隐藏文件夹的文件。

We installed the latest IIS on the local machine for a test, is there any changes needed to get it to work on the web as well.我们在本地机器上安装了最新的 IIS 进行测试,是否需要进行任何更改才能使其在 web 上工作。 (: we are new to IIS stuff) (:我们是 IIS 的新手)

You could try below code:你可以试试下面的代码:

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

note: do not forget to add a reference to Microsoft.Web.Administration.注意:不要忘记添加对 Microsoft.Web.Administration 的引用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM