基于Microsoft.Web.Administration的IIS自动挂站

45 篇文章 1 订阅
6 篇文章 0 订阅

今天在琢磨网站隔段时间打开很卡的情况,百度呗,各种尝试,走着走着突然发现一个能生成脚本的东西。

还有熟悉的C#,其他的无视,基本也不会。难道能用程序挂个站撒的?

查了查,果然有这么个东西。。。https://www.cnblogs.com/zhaochengshen/p/7976894.html

借来引用下:

C# IIS站点管理--Microsoft.Web.Administration.dll
Microsoft中提供了管理IIS7及以上版本一个非常强大的API - Microsoft.Web.Administration.dll,利用该API可以让我们很方便的以编程的方式管理和设定IIS的各项配置信息了。

Microsoft.Web.Administration.dll位于IIS目录下(%WinDir%\System32\InetSrv)下,在项目中添加引用后就可以使用这些API了。

 

目前挂站成功,一些需要的配置都能直接搞定。以后就不用各种配了,自己配置好了上去跑一下,瞬间完事。

 

 

 

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

namespace iis
{
    class Program
    {
        /// <summary>
        /// 自动挂站
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //CreateWebSite("testweb", 5678, "D:\\testweb\\testweb\\testweb");
            CreateWebSite("testweb", new List<HttpAndProt>() { new HttpAndProt() { HostName="www.test.com", Prot=8099 } }, "D:\\testweb\\testweb\\testweb");
        }

        /// <summary>
        /// 创建站点
        /// </summary>
        /// <param name="SiteName">站点名称</param>
        /// <param name="HttpAndProtList"></param>
        /// <param name="Path">站点路径 "D:\\testweb\\testweb\\testweb"  @"D:\testweb\testweb\testweb" 直接单斜线会出异常</param>
        /// <param name="Framework">版本 默认v4.0</param>
        /// <param name="StartMode"></param>
        /// <param name="MaxProcesses"></param>
        /// <param name="RecoveryTime"></param>
        /// <param name="IdleTime"></param>
        static void CreateWebSite(string SiteName, List<HttpAndProt> List, string Path, string Framework = "v4.0", StartMode StartMode = StartMode.AlwaysRunning, int MaxProcesses = 1, long RecoveryTime = 0, long IdleTime = 0)
        {
            #region 基础设置
            using (ServerManager serverManager = new ServerManager())
            {

                //判断应用程序池是否存在,可以使用linq
                if (serverManager.ApplicationPools[SiteName] != null)
                    serverManager.ApplicationPools.Remove(serverManager.ApplicationPools[SiteName]);

                //判断web应用程序是否存在
                if (serverManager.Sites[SiteName] != null)
                    serverManager.Sites.Remove(serverManager.Sites[SiteName]);

                //添加web应用程序池
                ApplicationPool appPool = serverManager.ApplicationPools.Add(SiteName);
                appPool.AutoStart = true;//启动
                appPool.QueueLength = 10000;
                appPool.ManagedRuntimeVersion = Framework;//Framework版本(注意版本号大小写问题)
                appPool.StartMode = StartMode;//启动模式
                appPool.Recycling.PeriodicRestart.Time = new TimeSpan(RecoveryTime);//回收时间间隔
                appPool.ProcessModel.IdleTimeout = new TimeSpan(IdleTime);//闲置超时
                appPool.ProcessModel.MaxProcesses = MaxProcesses;//最大工作进程数
                appPool.SetAttributeValue("enable32BitAppOnWin64", false);//启用32为应用程序

                //建立web应用程序 【站点名称 bindingProtocol(http)  bindingInformation(主机头等信息) 路径】
                var Site = serverManager.Sites.Add(SiteName, "http", GetBindingInformation(List), Path);

                Site.ApplicationDefaults.SetAttributeValue("preloadEnabled", true);
                Site.Applications[0].ApplicationPoolName = SiteName;//设置应用程序池

                //保存
                serverManager.CommitChanges();
            }
            #endregion

            #region 配置器设置
            using (ServerManager serverManager = new ServerManager())
            {
                //serverManager.Sites[SiteName].SetMetadata("preloadEnabled", true);
                //var SiteBindings = serverManager.Sites[SiteName].Bindings;
                //SiteBindings.Add("www.website1.com:80", "http");
                //SiteBindings.Add("website1.com:80","http");


                //获取网站配置
                Configuration config = serverManager.GetWebConfiguration(SiteName);

                //重新启动后执行应用初始化
                ConfigurationSection applicationInitializationSection = config.GetSection("system.webServer/applicationInitialization");
                //设置为true
                applicationInitializationSection["doAppInitAfterRestart"] = true;

                ConfigurationElementCollection applicationInitializationCollection = applicationInitializationSection.GetCollection();
                //清理初始化页
                applicationInitializationCollection.Clear();

                //如果没有对应路径会异常
                ConfigurationElement addElement = applicationInitializationCollection.CreateElement("add");
                addElement["initializationPage"] = @"/Home/Index";
                //addElement["hostName"] = @"";
                applicationInitializationCollection.Add(addElement);

                ConfigurationElement addElement1 = applicationInitializationCollection.CreateElement("add");
                addElement1["initializationPage"] = @"/HousingResources/Index";
                applicationInitializationCollection.Add(addElement1);

                ConfigurationElement addElement2 = applicationInitializationCollection.CreateElement("add");
                addElement2["initializationPage"] = @"/Index";
                applicationInitializationCollection.Add(addElement2);

                //保存
                serverManager.CommitChanges();

            }
            #endregion
        }

        /// <summary>
        /// 创建站点
        /// </summary>
        /// <param name="SiteName">站点名称</param>
        /// <param name="HttpAndProtList">http:</param>
        /// <param name="Path">站点路径 "D:\\testweb\\testweb\\testweb"  @"D:\testweb\testweb\testweb" 直接单斜线会出异常</param>
        /// <param name="Framework">版本 默认v4.0</param>
        /// <param name="StartMode"></param>
        /// <param name="MaxProcesses"></param>
        /// <param name="RecoveryTime"></param>
        /// <param name="IdleTime"></param>
        static void CreateWebSite(string SiteName, int Prot, string Path,string Framework = "v4.0", StartMode StartMode = StartMode.AlwaysRunning, int MaxProcesses = 1,long RecoveryTime = 0,long IdleTime = 0)
        {
            #region 基础设置
            using (ServerManager serverManager = new ServerManager())
            {
                
                //判断应用程序池是否存在,可以使用linq
                if (serverManager.ApplicationPools[SiteName] != null)
                    serverManager.ApplicationPools.Remove(serverManager.ApplicationPools[SiteName]);

                //判断web应用程序是否存在
                if (serverManager.Sites[SiteName] != null)
                    serverManager.Sites.Remove(serverManager.Sites[SiteName]);

                //添加web应用程序池
                ApplicationPool appPool = serverManager.ApplicationPools.Add(SiteName);
                appPool.AutoStart = true;//启动
                appPool.QueueLength = 10000;
                appPool.ManagedRuntimeVersion = Framework;//Framework版本(注意版本号大小写问题)
                appPool.StartMode = StartMode;//启动模式
                appPool.Recycling.PeriodicRestart.Time = new TimeSpan(RecoveryTime);//回收时间间隔
                appPool.ProcessModel.IdleTimeout = new TimeSpan(IdleTime);//闲置超时
                appPool.ProcessModel.MaxProcesses = MaxProcesses;//最大工作进程数
                appPool.SetAttributeValue("enable32BitAppOnWin64", false);//启用32为应用程序

                //建立web应用程序 【站点名称 程序池名称 绑定信息(域名IP主机端口) 路径】
                var Site = serverManager.Sites.Add(SiteName, Path, Prot);

                //var Site = serverManager.Sites.Add(SiteName, "http", GetBindingInformation(HttpAndProtList), Path);

                Site.ApplicationDefaults.SetAttributeValue("preloadEnabled", true);
                Site.Applications[0].ApplicationPoolName = SiteName;//设置应用程序池

                //保存
                serverManager.CommitChanges();
            }
            #endregion

            #region 配置器设置
            using (ServerManager serverManager = new ServerManager())
            {
                //serverManager.Sites[SiteName].SetMetadata("preloadEnabled", true);
                //var SiteBindings = serverManager.Sites[SiteName].Bindings;
                //SiteBindings.Add("www.website1.com:80", "http");
                //SiteBindings.Add("website1.com:80","http");

                
                //获取网站配置
                Configuration config = serverManager.GetWebConfiguration(SiteName);

                //重新启动后执行应用初始化
                ConfigurationSection applicationInitializationSection = config.GetSection("system.webServer/applicationInitialization");
                //设置为true
                applicationInitializationSection["doAppInitAfterRestart"] = true;


                ConfigurationElementCollection applicationInitializationCollection = applicationInitializationSection.GetCollection();
                //清理初始化页
                applicationInitializationCollection.Clear();

                ConfigurationElement addElement = applicationInitializationCollection.CreateElement("add");
                addElement["initializationPage"] = @"/Home/Index";
                //addElement["hostName"] = @"";
                applicationInitializationCollection.Add(addElement);

                ConfigurationElement addElement1 = applicationInitializationCollection.CreateElement("add");
                addElement1["initializationPage"] = @"/HousingResources/Index";
                applicationInitializationCollection.Add(addElement1);

                ConfigurationElement addElement2 = applicationInitializationCollection.CreateElement("add");
                addElement2["initializationPage"] = @"/Index";
                applicationInitializationCollection.Add(addElement2);

                //保存
                serverManager.CommitChanges();
                
            }
            #endregion
        }

        /// <summary>
        /// 组装绑定数据 http:192.168.0.119:80:www.test.net
        /// </summary>
        /// <param name="List"></param>
        /// <returns></returns>
        static string GetBindingInformation(List<HttpAndProt> List)
        {
            string Result = "";
            foreach (var Info in List)
            {
                Result += Info.IP +":"+ Info.Prot+":"+ Info.HostName + ",";
            }
            if (Result.Length > 0)
            {
                Result = Result.TrimEnd(',');
            }
            return Result;
        }
        
    }

    /// <summary>
    /// 构建绑定数据
    /// </summary>
    class HttpAndProt
    {
        /// <summary>
        /// IP(默认*)
        /// </summary>
        public string IP { get; set; } = "*";
        /// <summary>
        /// 端口(默认80)
        /// </summary>
        public int Prot { get; set; } = 80;
        /// <summary>
        /// 主机名/域名(默认"")
        /// </summary>
        public string HostName { get; set; } = "";
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Unity WebGL 中,使用 `Microsoft.Web.Administration` 库会出现编译错误,因为该库是基于 Windows Server 上的 IIS 管理器开发的,而不是基于浏览器的 WebGL 环境。 如果需要在 Unity WebGL 中进行 Web 开发,可以使用 JavaScript 或 TypeScript 语言编写代码,并结合 HTML、CSS 等前端技术来实现。可以使用 Unity 提供的 `Application.ExternalEval` 方法来在 JavaScript 和 C# 之间进行通信。 以下是在 Unity WebGL 中使用 JavaScript 实现启动本地 HTTP 服务器的示例代码: ```javascript function startHttpServer() { var http = require('http'); var fs = require('fs'); var path = require('path'); var server = http.createServer(function (req, res) { var filePath = '.' + req.url; if (filePath == './') { filePath = './index.html'; } var extname = path.extname(filePath); var contentType = 'text/html'; switch (extname) { case '.js': contentType = 'text/javascript'; break; case '.css': contentType = 'text/css'; break; case '.json': contentType = 'application/json'; break; case '.png': contentType = 'image/png'; break; case '.jpg': contentType = 'image/jpg'; break; case '.wav': contentType = 'audio/wav'; break; } fs.readFile(filePath, function(error, content) { if (error) { if(error.code == 'ENOENT'){ res.writeHead(404); res.end('404 Not Found'); res.end(); } else { res.writeHead(500); res.end('500 Internal Server Error'); res.end(); } } else { res.writeHead(200, { 'Content-Type': contentType }); res.end(content, 'utf-8'); } }); }); server.listen(8000); } ``` 在上述 JavaScript 代码中,使用 Node.js 的 `http` 模块来创建一个本地 HTTP 服务器,监听端口为 8000。在浏览器中访问 `http://localhost:8000`,即可看到当前目录下的文件列表,点击相应文件即可下载。 在 Unity C# 代码中,使用 `Application.ExternalEval` 方法来调用 JavaScript 代码,示例代码如下: ```csharp using UnityEngine; public class HttpServer : MonoBehaviour { void Start() { Application.ExternalEval("startHttpServer();"); } } ``` 在 `Start` 方法中,使用 `Application.ExternalEval` 方法调用 JavaScript 代码中的 `startHttpServer` 函数,启动本地 HTTP 服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值