c# - 使用Asp.net web C#在IIS上动态创建网站

标签 c# asp.net iis

我们提到了stackOverflow和其他一些站点使用控制台应用程序在 IIS 上创建网站。在我们以管理权限运行控制台后,它就起作用了。代码确实在给定端口上创建应用程序池和主机站点。当我们在 ASP.NET Web 应用程序上尝试使用相同的代码时,它完成了执行,但我们在 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 中。 enter image description here

现在,当在 Web 应用程序上尝试相同的代码时,它不会在 IIS 上创建任何内容。当我们检查服务器管理器对象时,我们发现应用程序池列表来自项目的

applicationhost.config

文件位于 .vs 隐藏文件夹中。

我们在本地计算机上安装了最新的 IIS 进行测试,是否需要进行任何更改才能使其在网络上运行。 (:我们对 IIS 还不熟悉)

最佳答案

您可以尝试以下代码:

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 的引用。

关于c# - 使用Asp.net web C#在IIS上动态创建网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62815692/

相关文章:

css 在 asp.net 中的 contentPlaceHolder 的 div 中不起作用

iis - 如何使用 powershell 删除 SSL 绑定(bind)

c# - ProcessStartInfo 在 PATH 环境变量中运行 exe

c# - 在 ASP.net MVC 3 中的按钮上应用 CSS

asp.net - ASP 站点根 url

jquery - JSON 格式无效

iis - WS-Management 服务无法处理该请求。该服务被配置为不接受任何远程 shell 请求

asp.net - 间歇性 ASP.Net 状态服务错误

c# - WPF 如何单击 DataGrid 中的行以取消选择项目

c# - 使用设计模式重构多个变量