PHP小丑 发表于 2022-4-29 10:42:38

C#部署数据库及IIS站点

这篇文章主要为大家详细介绍了C#部署数据库及IIS站点的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
一、前言
最近忙里偷闲,做了一个部署数据库及iis网站站点的wpf应用程序工具。
二、内容
此工具的目的是:

[*]根据.sql文件在本机上部署数据库
[*]在本机部署iis站点,包括新建站点,新建应用程序池。只新建而不会对本机上原有的程序池或站点做修改操作
最终样式:(check按钮的作用是防止与本机已有的站点或程序池有冲突)

view:


<window x:class="autowebtool.mainwindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:i="http://schemas.microsoft.com/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.componentmodel;
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 + " /.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));
    }
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家。
原文链接:https://www.cnblogs.com/lovecsharp094/archive/2018/03/21/8618139.html

http://www.zzvips.com/article/225521.html
页: [1]
查看完整版本: C#部署数据库及IIS站点