注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

一个初具框架的WEB打包程序之二编码  

2013-03-27 19:28:24|  分类: NET(C#) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一个初具框架的WEB打包程序之二编码

上文把界面基本说了一下,现在主要是编码了,郑重声明一下,这些代码是从网上找的,地址是:

http://www.soaspx.com/dotnet/asp.net/tech/tech_20110801_7940.html

上面有完整的代码下载所以这里就不再提供下载代码了,只对代码进行分析和修改。

重点就是重写install这个函数:

        /// <summary>

        /// 安装

        /// </summary>

        /// <param name="stateSaver"></param>

        public override void Install(IDictionary stateSaver)

        {

            if (ExistSqlServerService())

            {

                if (IsExistSitePort())

                {

                    MessageBox.Show("站点端口号重复", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                    return;

                }

                if (IsExistSiteName(Context.Parameters["sitename"].ToString()))

                {

                    MessageBox.Show("站点名称重复", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                    return;

                }

                

                base.Install(stateSaver);

  //此处的数据库处理操作和COM及一些辅助操作删除,详情大家可看源码。

                try

                {

                    CreateDeskTopShortcut();

                    string s = Context.Parameters["installdir"].ToString().Replace("\\\\","");

                    NewWebSiteInfo siteInfo = new NewWebSiteInfo(string.Empty, Context.Parameters["siteport"].ToString(), "", Context.Parameters["sitename"].ToString(), s);

                    CreateNewWebSite(siteInfo);

                    //SetAppToPool("Setup1");//只能遍历虚拟目录,不能遍历网站

                   

                    //使用名称启动网站虽然可以启动但会弹出一个错误框,但使用序号不会。

                    //StartWebSite(siteInfo.BindString);

                    StartWebSiteByNum(siteInfo.BindString);

                   

                }

                catch(Exception ex)

                {

                    MessageBox.Show("创建站点失败!\n" + ex.Message, "出错!");

                    //this.Rollback(stateSaver);

                     CreateVirWebSite("Message", Context.Parameters["installdir"].ToString() + "Message");

                     CreateVirWebSite("MoreUpload", Context.Parameters["installdir"].ToString() + "MoreUpload");

                }

            }

            else

            {

                MessageBox.Show("检测到您的电脑没有安装SQL SERVER,无法继续安装此产品", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                this.Rollback(stateSaver);

            }

 

        }

这里面最重要的函数当然是:

    /// <summary>

    /// 创建网站

    /// </summary>

    /// <param name="siteInfo"></param>

      public  void CreateNewWebSite(NewWebSiteInfo siteInfo)

        {

            if (!EnsureNewSiteEnavaible(siteInfo.BindString))

            {

                throw new Exception("该网站已存在" + Environment.NewLine + siteInfo.BindString);

            }

            DirectoryEntry rootEntry = GetDirectoryEntry(entPath);

 

            newSiteNum = GetNewWebSiteID();

            DirectoryEntry newSiteEntry = rootEntry.Children.Add(newSiteNum, "IIsWebServer");

            newSiteEntry.CommitChanges();

 

            newSiteEntry.Properties["ServerBindings"].Value = siteInfo.BindString;

            newSiteEntry.Properties["ServerComment"].Value = siteInfo.CommentOfWebSite;

            //newSiteEntry.Properties["AppPoolId"].Value = "ASP.NET v4.0";

            newSiteEntry.CommitChanges();

            DirectoryEntry vdEntry = newSiteEntry.Children.Add("root", "IIsWebVirtualDir");

            vdEntry.CommitChanges();

            vdEntry.Properties["Path"].Value = siteInfo.WebPath;

            vdEntry.Invoke("AppCreate", true);//创建应用程序

 

            vdEntry.Properties["AccessRead"][0] = true; //设置读取权限

            vdEntry.Properties["DefaultDoc"][0] = Context.Parameters["startpage"].ToString();//设置默认文档

            vdEntry.Properties["AppFriendlyName"][0] = "Toncent"; //应用程序名称

            vdEntry.Properties["AccessScript"][0] = true;//执行权限

            vdEntry.Properties["AuthFlags"][0] = 1;//0表示不允许匿名访问,1表示就可以3为基本身份验证,7windows继承身份验证

            vdEntry.Properties["AppPoolId"].Value = "ASP.NET v4.0";

            vdEntry.CommitChanges();

 

            //启动aspnet_regiis.exe程序

            string fileName = Environment.GetEnvironmentVariable("windir") + @"\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe";

            ProcessStartInfo startInfo = new ProcessStartInfo(fileName);

 

            //处理目录路径

            string path = vdEntry.Path.ToUpper();

            int index = path.IndexOf("W3SVC");

            path = path.Remove(0, index);

            //启动ASPnet_iis.exe程序,刷新脚本映射

            startInfo.Arguments = "-s " + path;

            startInfo.WindowStyle = ProcessWindowStyle.Hidden;

            startInfo.UseShellExecute = false;

            startInfo.CreateNoWindow = true;

            startInfo.RedirectStandardOutput = true;

            startInfo.RedirectStandardError = true;

            Process process = new Process();

            process.StartInfo = startInfo;

            process.Start();

            process.WaitForExit();

            string errors = process.StandardError.ReadToEnd();

            if (errors != string.Empty)

            {

                throw new Exception(errors);

            }

 

        }

这里重点说一下string s = Context.Parameters["installdir"].ToString().Replace("\\\\","")这段代码,原来的源码中是没有的,但是发现在创建网站的物理路径是这里会多一个\,所以只好用这种方法把他去掉,其实也可以换成\\,大家要明白,因为转义的原因,两个就是四个,一个就是两个\。希望没把你弄糊涂了。

另外一个是   StartWebSite(siteInfo.BindString);StartWebSiteByNum(siteInfo.BindString);函数,如果用前面的以名字启动新建立的网站,就会弹出一个错误,而以后面这个以ID启动就不会有错误,不知道原因,还是不太了解IIS,其实是使用ADSI来操作IIS

在创建新的站点时使用线程池,一般如果不干涉的话是DefaultPool,可是现在都在用NET4,如果不想手动处理IIS管理器,那么在创建时把:

vdEntry.Properties["AppPoolId"].Value = "ASP.NET v4.0";

加到创建的函数中,就会自动使用asp.net v4.0 这个线程池。

        /// <summary>

        /// 启动网站的新版本 2013-03-20

        /// </summary>

        /// <param name="siteName"></param>

        public  void StartWebSiteByNum(string siteName)

        {

            string siteNum = GetWebSiteNum(siteName);

            string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", "localhost", siteNum);

            DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);

            siteEntry.Invoke("Start", new object[] { });

        }

        /// <summary>

        /// 启动站点

        /// </summary>

        /// <param name="siteName"></param>

        public void StartWebSite(string websiteName)

        {

            string siteName = Context.Parameters["sitename"].ToString();

            //dbpath = Path.Combine(this.Context.Parameters["installdir"].ToString(), "dbconfig.xml");

            //OperateXML.UpdateXMLNode(dbpath, "SiteName", siteName);

            string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", "localhost", siteName);

            DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);

            siteEntry.Invoke("Start", new object[] { });

        }

这是两个不同的启动站点的方法。后者就会报错。前者没有问题。

这样的话,一个站点的主要的核心代码就说好了。

  评论这张
 
阅读(894)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017