使用 C# 以编程方式在 IIS 中创建网站并设置端口号
Posted
技术标签:
【中文标题】使用 C# 以编程方式在 IIS 中创建网站并设置端口号【英文标题】:Programmatically create a web site in IIS using C# and set port number 【发布时间】:2010-11-20 04:27:26 【问题描述】:我们已经能够创建一个网站。我们使用此链接中的信息做到了这一点:
https://msdn.microsoft.com/en-us/library/ms525598.aspx
但是,我们想使用端口 80 以外的端口号。我们该怎么做?
我们使用的是 IIS 6
【问题讨论】:
你使用的是什么 IIS 版本? 您想在设置过程中指定端口还是通过代码将网站添加到IIS? @Wael 将网站添加到 IIS 并同时指定该网站的端口号。 您可以查看此链接。它有完整的代码和指令。只需确保您在管理员模式下打开 Visual Studio 和其他人。 asptricks.net/2016/08/… 【参考方案1】:如果您使用的是 IIS 7,则有一个名为 Microsoft.Web.Administration 的新托管 API
上述博文中的一个例子:
ServerManager iisManager = new ServerManager();
iisManager.Sites.Add("NewSite", "http", "*:8080:", "d:\\MySite");
iisManager.CommitChanges();
如果您正在使用 IIS 6 并且想要这样做,那么不幸的是它会更复杂。
您必须在每台服务器上创建一个 Web 服务,一个处理网站创建的 Web 服务,因为通过网络直接模拟用户将无法正常工作(如果我没记错的话)。
您将不得不使用互操作服务并执行类似的操作(此示例使用两个对象,服务器和站点,它们是存储服务器和站点配置的自定义类的实例):
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;
查看更多here
【讨论】:
谢谢,很遗憾我们使用的是 IIS 6。 我在一个遗留维护项目中做过一次,我看看能不能找到代码。不幸的是,它非常神秘且令人费解。 太棒了...顺便提一下应用程序池...可能需要一些额外的配置...【参考方案2】:这就是解决方案。Blog article : How to add new website in 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;
【讨论】:
仅适用于 IIS7.. 找不到 IIS6 的参考 要检查 IsWebsiteExists,请参阅我的回答。这可能是更聪明的方式 @AdamDrewery 没有帮助。他工作的地方可能需要它。 @LiakatHossain 虽然我更喜欢你的 lambda 风格,但它的逻辑完全一样。【参考方案3】:试试下面的代码知道未使用的端口号
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;
【讨论】:
【参考方案4】:我已经在这里回答了所有问题并进行了测试。这是此问题的最干净更智能的答案版本。但是,这仍然无法在 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;
【讨论】:
【参考方案5】:-
在站点属性中选择“网站”选项卡并指定 TCP 端口。
在工作室中调试目的指定http://localhost:<port>/<site>;在“使用本地 IIS Web 服务器”的 Web 选项卡上
【讨论】:
感谢您的回复。但这就是你使用 UI 的方式,我需要知道如何在代码中完成。 你能在 JScript 或 VBScript 上使用 wmi 吗?以上是关于使用 C# 以编程方式在 IIS 中创建网站并设置端口号的主要内容,如果未能解决你的问题,请参考以下文章
如何以最简单的方式在 V 2010Express C# 中创建 MRU?
以编程方式检索源文件夹列表并创建一个(如果不存在) - C# + VSTS 2017
如何以编程方式在 android 中创建 *** 配置文件并连接到它?