好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#部署数据库及IIS站点

一、前言

最近忙里偷闲,做了一个部署数据库及iis网站站点的wpf应用程序工具。 

二、内容

此工具的目的是:

根据.sql文件在本机上部署数据库 在本机部署iis站点,包括新建站点,新建应用程序池。只新建而不会对本机上原有的程序池或站点做修改操作

最终样式:(check按钮的作用是防止与本机已有的站点或程序池有冲突)

view:

 

?

<window x: class = "autowebtool.mainwindow"

     xmlns= "http://schemas.microsoft测试数据/winfx/2006/xaml/presentation"

     xmlns:x= "http://schemas.microsoft测试数据/winfx/2006/xaml"

     xmlns:d= "http://schemas.microsoft测试数据/expression/blend/2008"

     xmlns:mc= "http://schemas.openxmlformats.org/markup-compatibility/2006"

     xmlns:i= "http://schemas.microsoft测试数据/expression/2010/interactivity"

     xmlns:local= "clr-namespace:autowebtool"

     title= "web site automatic deployment" height= "500" width= "800" windowstartuplocation= "centerscreen" resizemode= "noresize" >

   <grid>

     <grid.rowdefinitions>

       <rowdefinition height= "0.5*" />

       <rowdefinition height= "0.5*" />

       <rowdefinition height= "auto" />

     </grid.rowdefinitions>

     <groupbox header= "database configuration" fontsize= "15" borderthickness= "3" margin= "5,10" grid.row= "0" >

       <grid>

         <grid.rowdefinitions>

           <rowdefinition/>

           <rowdefinition/>

           <rowdefinition/>

           <rowdefinition/>

         </grid.rowdefinitions>

         <grid.columndefinitions>

           <columndefinition width= "65*" />

           <columndefinition width= "133*" />

           <columndefinition width= "auto" />

         </grid.columndefinitions>

 

         <textblock grid.row= "0" grid.column= "0" text= "server address" horizontalalignment= "center" verticalalignment= "center" fontsize= "15" height= "26" />

         <textblock grid.row= "1" grid.column= "0" text= "user" horizontalalignment= "center" verticalalignment= "center" fontsize= "15" height= "26" />

         <textblock grid.row= "2" grid.column= "0" text= "password" horizontalalignment= "center" verticalalignment= "center" fontsize= "15" height= "26" />

         <textblock grid.row= "3" grid.column= "0" text= "script path" horizontalalignment= "center" verticalalignment= "center" fontsize= "15" height= "26" />

 

         <textbox grid.row= "0" grid.column= "1" text= "{binding serveraddress, mode=twoway, updatesourcetrigger=propertychanged}"

            horizontalalignment= "left" verticalalignment= "center" fontsize= "15" width= "450" height= "32" />

         <textbox grid.row= "1" grid.column= "1" text= "{binding user, mode=twoway, updatesourcetrigger=propertychanged}"

            horizontalalignment= "left" verticalalignment= "center" fontsize= "15" width= "450" height= "32" />

         <passwordbox grid.row= "2" grid.column= "1" passwordchar= "*" local:passwordboxhelper.password= "{binding password, mode=twoway, updatesourcetrigger=propertychanged}"

            horizontalalignment= "left" verticalalignment= "center" fontsize= "15" width= "450" height= "32" >

           <i:interaction.behaviors>

             <local:passwordboxbehavior />

           </i:interaction.behaviors>

         </passwordbox>

         <textbox grid.row= "3" grid.column= "1" text= "{binding sqlpath, mode=twoway, updatesourcetrigger=propertychanged}"

            horizontalalignment= "left" verticalalignment= "center" fontsize= "15" width= "450" height= "32" />

 

         <button grid.row= "4" grid.column= "2" width= "70" height= "25" margin= "0,0,10,0"

             horizontalalignment= "left" verticalalignment= "center" content= "browse" click= "filepathbrowse_click" />

       </grid>

     </groupbox>

     <groupbox header= "website and pool" fontsize= "15" borderthickness= "3" margin= "5,10" grid.row= "1" >

       <grid>

         <grid.rowdefinitions>

           <rowdefinition/>

           <rowdefinition/>

           <rowdefinition/>

           <rowdefinition/>

           <rowdefinition/>

         </grid.rowdefinitions>

         <grid.columndefinitions>

           <columndefinition width= "65*" />

           <columndefinition width= "133*" />

           <columndefinition width= "auto" />

         </grid.columndefinitions>

 

         <textblock grid.row= "0" grid.column= "0" text= "website name" horizontalalignment= "center" verticalalignment= "center" fontsize= "15" height= "26" />

         <textblock grid.row= "1" grid.column= "0" text= "website id" horizontalalignment= "center" verticalalignment= "center" fontsize= "15" height= "26" />

         <textblock grid.row= "2" grid.column= "0" text= "website physicalpath" horizontalalignment= "center" verticalalignment= "center" fontsize= "15" height= "26" />

         <textblock grid.row= "3" grid.column= "0" text= "website port" horizontalalignment= "center" verticalalignment= "center" fontsize= "15" height= "26" />

         <textblock grid.row= "4" grid.column= "0" text= "application pool name" horizontalalignment= "center" verticalalignment= "center" fontsize= "15" height= "26" />

 

         <textbox grid.row= "0" grid.column= "1" text= "{binding websitename, mode=twoway, updatesourcetrigger=propertychanged}"

            horizontalalignment= "left" verticalalignment= "center" fontsize= "15" width= "450" height= "32" />

         <textbox grid.row= "1" grid.column= "1" text= "{binding websiteid, mode=twoway, updatesourcetrigger=propertychanged}"

            horizontalalignment= "left" verticalalignment= "center" fontsize= "15" width= "450" height= "32" />

         <textbox grid.row= "2" grid.column= "1" text= "{binding physicalpath, mode=twoway, updatesourcetrigger=propertychanged}"

            horizontalalignment= "left" verticalalignment= "center" fontsize= "15" width= "450" height= "32" />

         <textbox grid.row= "3" grid.column= "1" text= "{binding websiteport, mode=twoway, updatesourcetrigger=propertychanged}"

            horizontalalignment= "left" verticalalignment= "center" fontsize= "15" width= "450" height= "32" />

         <textbox grid.row= "4" grid.column= "1" text= "{binding poolname, mode=twoway, updatesourcetrigger=propertychanged}"

            horizontalalignment= "left" verticalalignment= "center" fontsize= "15" width= "450" height= "32" />

 

         <button grid.row= "0" grid.column= "2" width= "70" height= "25" margin= "0,0,10,0"

             horizontalalignment= "left" verticalalignment= "center" content= "check" click= "websitenamecheck_click" />

         <button grid.row= "1" grid.column= "2" width= "70" height= "25" margin= "0,0,10,0"

             horizontalalignment= "left" verticalalignment= "center" content= "check" click= "websiteidcheck_click" />

         <button grid.row= "2" grid.column= "2" width= "70" height= "25" margin= "0,0,10,0"

             horizontalalignment= "left" verticalalignment= "center" content= "browse" click= "pathbrowse_click" />

         <button grid.row= "3" grid.column= "2" width= "70" height= "25" margin= "0,0,10,0"

             horizontalalignment= "left" verticalalignment= "center" content= "check" click= "websiteportcheck_click" />

         <button grid.row= "4" grid.column= "2" width= "70" height= "25" margin= "0,0,10,0"

             horizontalalignment= "left" verticalalignment= "center" content= "check" click= "poolnamecheck_click" />

       </grid>

     </groupbox>

     <stackpanel grid.row= "2" orientation= "horizontal" horizontalalignment= "right" verticalalignment= "center" margin= "10" >

       <button width= "70" height= "25" content= "ok" click= "deploy_click" />

       <button width= "70" height= "25" content= "cancel" margin= "10,0,0,0" click= "close_click" />

     </stackpanel>

   </grid>

</window>

view的后台文件:

?

using system.windows;

using system.windows.controls;

using system.windows.interactivity;

 

namespace autowebtool

{

   /// <summary>

   /// mainwindow.xaml 的交互逻辑

   /// </summary>

   public partial class mainwindow : window

   {

     private autogenerationvm _vm;

 

     public mainwindow()

     {

       initializecomponent();

       datacontext = new autogenerationvm();

       _vm = datacontext as autogenerationvm;

     }

 

     private bool sqlpath;

     private void filepathbrowse_click( object sender, routedeventargs e)

     {

       sqlpath = _vm.getsqlfilepath();

     }

 

 

     private void websitenamecheck_click( object sender, routedeventargs e)

     {

       var isinuse = _vm.checknameandid();

       if (isinuse)

       {

         messagebox.show( "1.this name is empty \r\n2.this name is in use,please change name!" );

       }

       else

       {

         messagebox.show( "no problem!" );

       }

     }

 

     private void websiteidcheck_click( object sender, routedeventargs e)

     {

       var isinuse = _vm.checknameandid();

       if (isinuse)

       {

         messagebox.show( "1.this id is empty \r\n2.this id is in use,please change id!" );

       }

       else

       {

         messagebox.show( "no problem!" );

       }

     }

 

     private bool physicalpath;

     private void pathbrowse_click( object sender, routedeventargs e)

     {

       physicalpath = _vm.getfolderpath();

     }

     private void websiteportcheck_click( object sender, routedeventargs e)

     {

       var isinuse = _vm.checkwebport();

       if (isinuse)

       {

         messagebox.show( "1.this port is empty \r\n2.this port is in use,please change port!" );

       }

       else

       {

         messagebox.show( "no problem!" );

       }

     }

     private void poolnamecheck_click( object sender, routedeventargs e)

     {

       var isinuse = _vm.ckeckpoolname();

       if (isinuse)

       {

         messagebox.show( "1.this pool name is empty \r\n2.this name is in use,please change name!" );

       }

       else

       {

         messagebox.show( "no problem!" );

       }

     }

 

     private void deploy_click( object sender, routedeventargs e)

     {

       var databaseserveraddresschecked = string .isnullorempty(_vm.serveraddress);

       var databaseuserchecked = string .isnullorempty(_vm.user);

       var databasepasswordchecked = string .isnullorempty(_vm.password);

       var databasescriptchecked = sqlpath;

       var databasecondition = !databaseserveraddresschecked && !databaseuserchecked && !databasepasswordchecked && !databasescriptchecked;

 

       var websitenameandidchecked = _vm.checknameandid();

       var websiteportchecked = _vm.checkwebport();

       var applicationpoolnamechecked = _vm.ckeckpoolname();

       var websitecondition = !websitenameandidchecked && !physicalpath && !websiteportchecked && !applicationpoolnamechecked;

 

       if (databasecondition&& websitecondition)

       {

         _vm.execute();

       }

       else {

         messagebox.show( "please check your input!" );

       }

     }

 

     private void close_click( object sender, routedeventargs e)

     {

       close();

     }

   }

 

   public static class passwordboxhelper

   {

     public static readonly dependencyproperty passwordproperty =

       dependencyproperty.registerattached( "password" ,

       typeof ( string ), typeof (passwordboxhelper),

       new frameworkpropertymetadata( string .empty, onpasswordpropertychanged));

 

     private static void onpasswordpropertychanged(dependencyobject sender, dependencypropertychangedeventargs e)

     {

       var passwordbox = sender as passwordbox;

 

       string password = ( string )e.newvalue;

 

       if (passwordbox != null && passwordbox.password != password)

       {

         passwordbox.password = password;

       }

     }

 

     public static string getpassword(dependencyobject dp)

     {

       return ( string )dp.getvalue(passwordproperty);

     }

 

     public static void setpassword(dependencyobject dp, string value)

     {

       dp.setvalue(passwordproperty, value);

     }

   }

 

   public class passwordboxbehavior : behavior<passwordbox>

   {

     protected override void onattached()

     {

       base .onattached();

 

       associatedobject.passwordchanged += onpasswordchanged;

     }

 

     private static void onpasswordchanged( object sender, routedeventargs e)

     {

       var passwordbox = sender as passwordbox;

 

       string password = passwordboxhelper.getpassword(passwordbox);

 

       if (passwordbox != null && passwordbox.password != password)

       {

         passwordboxhelper.setpassword(passwordbox, passwordbox.password);

       }

     }

 

     protected override void ondetaching()

     {

       base .ondetaching();

 

       associatedobject.passwordchanged -= onpasswordchanged;

     }

   }

}

viewmodel:

?

using system;

using system.directoryservices;

using system测试数据ponentmodel;

using system.linq;

using system.net;

using system.net.networkinformation;

using microsoft.web.administration;

using system.windows.forms;

using system.diagnostics;

using system.data.sqlclient;

using system.io;

 

namespace autowebtool

{

   public class autogenerationvm : inotifypropertychanged

   {

 

     public autogenerationvm()

     {

       _physicalpath = appdomain.currentdomain.basedirectory;

     }

 

     //database serveraddress

     private string _serveraddress = string .empty;

 

     public string serveraddress

     {

       get { return _serveraddress; }

       set

       {

         if (_serveraddress != value)

         {

           _serveraddress = value;

           notifypropertychanged( "serveraddress" );

         }

       }

     }

 

 

     //database user

     private string _user = string .empty;

 

     public string user

     {

       get { return _user; }

       set

       {

         if (_user != value)

         {

           _user = value;

           notifypropertychanged( "user" );

         }

       }

     }

 

 

     //database password

     private string _password = string .empty;

 

     public string password

     {

       get { return _password; }

       set

       {

         if (_password != value)

         {

           _password = value;

           notifypropertychanged( "password" );

         }

       }

     }

 

 

     //database sqlpath

     private string _sqlpath = string .empty;

 

     public string sqlpath

     {

       get { return _sqlpath; }

       set

       {

         if (_sqlpath != value)

         {

           _sqlpath = value;

           notifypropertychanged( "sqlpath" );

         }

       }

     }

 

 

     public bool getsqlfilepath() {

 

       var openfiledialog = new openfiledialog();

       openfiledialog.filter = "数据库脚本文件|*.sql" ;

       if (openfiledialog.showdialog() == dialogresult.ok)

       {

         sqlpath = openfiledialog.filename;

       }

       return false ;

     }

 

 

     //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

     //website name

     private string _websitename = string .empty;

 

     public string websitename

     {

       get { return _websitename; }

       set

       {

         if (_websitename != value)

         {

           _websitename = value;

           notifypropertychanged( "websitename" );

         }

       }

     }

 

 

     //website id

     private string _websiteid = string .empty;

 

     public string websiteid

     {

       get { return _websiteid; }

       set

       {

         if (_websiteid != value)

         {

           _websiteid = value;

           notifypropertychanged( "websiteid" );

         }

       }

     }

 

 

     /// <summary>

     /// check website name and id

     /// </summary>

     /// <returns></returns>

     public bool checknameandid()

     {

       if ( string .isnullorempty(websitename) || string .isnullorempty(websiteid)) return true ;

 

       directoryentry rootentry = new directoryentry( "iis://localhost/w3svc" );

       foreach (directoryentry entry in rootentry.children)

       {

         if (entry.schemaclassname.equals( "iiswebserver" , stringcomparison.ordinalignorecase))

         {

           if (websiteid == entry.name) {

             return true ;

           }

           if (entry.properties[ "servercomment" ].value.tostring() == websitename)

           {

             return true ;

           }

         }

       }

       return false ;

     }

 

 

     //physical path

     private string _physicalpath = string .empty;

 

     public string physicalpath

     {

       get { return _physicalpath; }

       set

       {

         if (_physicalpath != value)

         {

           _physicalpath = value;

           notifypropertychanged( "physicalpath" );

         }

       }

     }

 

     /// <summary>

     /// get path for website

     /// </summary>

     public bool getfolderpath()

     {

       if ( string .isnullorempty(physicalpath)) return true ;

       var openfolderdialog = new folderbrowserdialog();

       if (openfolderdialog.showdialog() == dialogresult.ok)

       {

         physicalpath = openfolderdialog.selectedpath;

       }

       return false ;

     }

 

     //website port

     private string _websiteport = string .empty;

 

     public string websiteport

     {

       get { return _websiteport; }

       set

       {

         if (_websiteport != value)

         {

           _websiteport = value;

           notifypropertychanged( "websiteport" );

         }

       }

     }

 

 

     /// <summary>

     /// check website port

     /// </summary>

     /// <returns></returns>

     public bool checkwebport()

     {

       try

       {

         ipglobalproperties ipproperties = ipglobalproperties.getipglobalproperties();

         ipendpoint[] ipendpoints = ipproperties.getactivetcplisteners();

 

         foreach (ipendpoint endpoint in ipendpoints)

         {

           if (endpoint.port == convert.toint32(websiteport))

           {

             return true ;

           }

         }

         return false ;

 

       }

       catch {

 

         return true ;

       }     

     }

 

 

     //pool name

     private string _poolname = string .empty;

 

     public string poolname

     {

       get { return _poolname; }

       set

       {

         if (_poolname != value)

         {

           _poolname = value;

           notifypropertychanged( "poolname" );

         }

       }

     }

 

 

     /// <summary>

     /// check application pool name

     /// </summary>

     /// <returns></returns>

     public bool ckeckpoolname()

     {

       if ( string .isnullorempty(poolname)) return true ;

       var manager = new servermanager();

       var list = manager.applicationpools;

       var matcheditem = list.firstordefault(x => x.name == poolname);

       if (matcheditem != null )

         return true ;

       return false ;

     }

 

 

     /// <summary>

     /// execute script

     /// </summary>

     public void execute()

     {

       //deploy database

       var tmpconn = new sqlconnection();

       tmpconn.connectionstring = "server = " + serveraddress + "; database = master; user id = " + user+ "; pwd = " + password+ ";" ;

       var scriptfile = new fileinfo(sqlpath);

       var sqlcreatedbquery = scriptfile.opentext().readtoend();

       sqlcommand mycommand = new sqlcommand(sqlcreatedbquery, tmpconn);

       try

       {

         tmpconn.open();

         mycommand.executenonquery();

         messagebox.show( "database has been created successfully!" , "create database" , messageboxbuttons.ok,messageboxicon.information);

       }

       catch (exception ex)

       {

         messagebox.show(ex.tostring(), "create database" , messageboxbuttons.ok, messageboxicon.information);

         return ;

       }

       finally

       {

         tmpconn.close();

        

       }

 

 

       try

       {

         //deploy website and application pool

         var script = "net start w3svc " +

                "& cd c:/windows/system32/inetsrv " +

                "& appcmd add site /name:" + websitename + " /id:" + websiteid +

                " /physicalpath:" + physicalpath + " /bindings:http/*:" + websiteport + ":" + websitename +

                " & appcmd add apppool /name:" + poolname + " /managedruntimeversion:v4.0 /managedpipelinemode:integrated" +

                " & appcmd set site /site.name:" + websitename + " /[path='/'].applicationpool:" + poolname;

 

         processstartinfo startinfo = new processstartinfo();

         startinfo.workingdirectory = @"c:\windows\system32" ;

         startinfo.filename = @"c:\windows\system32\cmd.exe" ;

         startinfo.redirectstandardinput = true ;

         startinfo.redirectstandardoutput = true ;

         startinfo.redirectstandarderror = true ;

         startinfo.useshellexecute = false ;

         startinfo.verb = "runas" ;

 

         process process = new process();

         process.startinfo = startinfo;

         process.start();

         process.standardinput.writeline(script);

         process.standardinput.writeline( "&exit" );

         process.standardinput.flush();

         process.standardinput.close();

         process.waitforexit();

 

         messagebox.show( "iis website and application pool deployed successfully!" , "create website and application pool" , messageboxbuttons.ok, messageboxicon.information);

       }

       catch (exception ex)

       {

         messagebox.show(ex.tostring(), "exception" , messageboxbuttons.ok, messageboxicon.information);

       }

     }

 

     public event propertychangedeventhandler propertychanged;

     private void notifypropertychanged( string name)

     {

       propertychanged?.invoke( this , new propertychangedeventargs(name));

     }

   }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://HdhCmsTestcnblogs测试数据/lovecsharp094/archive/2018/03/21/8618139.html

dy("nrwz");

查看更多关于C#部署数据库及IIS站点的详细内容...

  阅读:47次