c# - 使用 Asp.net web C# 在 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()
}
现在,当在 Web 应用程序上尝试相同的代码时,它不会在 IIS 上创建任何内容。当我们检查服务器管理器对象时,我们发现应用程序池列表来自项目的
应用程序主机配置
位于 .vs 隐藏文件夹中的文件。
我们在本地机器上安装了最新的 IIS 进行测试,是否需要进行任何更改才能使其在 Web 上运行。(:我们是 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 的引用。
推荐阅读
- javascript - 反应状态更新:更新计时器中的状态不会正确更新值
- azure-active-directory - 是否可以为应用程序设置“独立”自定义声明?
- python - 为什么我会在 django 中重定向到错误的视图?
- android - 如何从 FirebaseFirestore 获取数据到 ListView?
- python - 如何使用 Windows10 深色边框设置 Python Tkinter GUI 应用程序?
- angular - 如何在像 MatTabBodyPositionState 这样的角度材料中使用角度类型别名
- php - 任何人都可以通过从放置在 html 文件中的 div 获取纯文本来帮助我
- environment-variables - 如何调试在本地工作的环境变量在 Vercel 的生产环境中不起作用
- python - 部署 django 应用程序时出现 Heroku H10 错误
- r - 如何在R中处理具有不规则网格的气候netCDF数据