65.9K
CodeProject 正在变化。 阅读更多。
Home

基于 Web 的应用程序配置向导

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (9投票s)

2008年5月18日

BSD

3分钟阅读

viewsIcon

46171

downloadIcon

234

一个向导,允许您通过 FTP 将应用程序上传到远程服务器,然后从 Web 浏览器启动配置向导以更新数据库连接。

引言

DotNetNuke 项目包含一套经过时间考验的设置向导,该向导在许多情况下都有效。 您可以使用Web 部署项目,但它需要您在服务器上运行安装程序。 这可能不适用于许多使用共享主机服务器的情况。 此向导允许您通过 FTP 将应用程序上传到远程服务器,然后从 Web 浏览器启动配置向导。

此示例提供了一个 C# 版本的向导,并将其封装到一个页面中,以便您轻松地自定义它。

应用程序

当用户打开未设置的应用程序的第一个页面时,他们会看到此屏幕

显示此内容的原因是以下代码尝试使用 LINQ to SQL Data Context 连接到数据库,该上下文使用web.config中的数据库连接设置。 如果能够连接,它会尝试计算 Users 表中的记录。 数据库可能存在,但 Users 表可能不存在。 这两者都需要存在才能认为设置已完成。 您可以插入代码来检查表中的版本号。 这将允许向导在升级情况下运行。

protected void Page_Load(object sender, EventArgs e)
{
    lnkSetup.Visible = !CanConnectToDatabase();
    lnkWebApplication.Visible = !lnkSetup.Visible;
}

private bool CanConnectToDatabase()
{
    // This method returns true if the database
    // exists and the table is created
    bool CanConnect = true;

    try
    {
        DataClassesDataContext DataClassesDataContext = 
                               new DataClassesDataContext();
        var result = from Users in DataClassesDataContext.Users
                     select Users;
        int intCount = result.Count();
       
    }
    catch (Exception e)
    {
        string strError = e.Message;
        CanConnect = false;
    }

    return CanConnect;
}

该链接会将用户带到向导的第一个页面

DotNetNuke 应用程序需要能够在服务器上创建目录和上传文件。 向导的下一页允许用户执行权限检查。

以下方法调用一系列执行每个检查的方法。 如果所有检查都通过,则会显示“继续下一步”按钮。

protected void btnCheckPermissions_Click(object sender, EventArgs e)
{
    int intValidItems = 0;
    blPermissions.Items.Clear();

    //FolderCreate
    ListItem permissionItem = new ListItem();
    permissionItem.Text = String.Format("Folder Create - {0}", 
      ((VerifyFolderCreate()) ? "Passed" : "Failed"));
    permissionItem.Enabled = 
      ((permissionItem.Text.Contains("Passed")) ? true : false);
    blPermissions.Items.Add(permissionItem);
    intValidItems = intValidItems + 
      ((permissionItem.Text.Contains("Passed")) ? 1 : 0);

    //FileCreate
    permissionItem = new ListItem();
    permissionItem.Text = String.Format("File Create - {0}", 
      ((VerifyFolderCreate()) ? "Passed" : "Failed"));
    permissionItem.Enabled = 
      ((permissionItem.Text.Contains("Passed")) ? true : false);
    blPermissions.Items.Add(permissionItem);
    intValidItems = intValidItems + 
      ((permissionItem.Text.Contains("Passed")) ? 1 : 0);

    //FileDelete
    permissionItem = new ListItem();
    permissionItem.Text = String.Format("File Delete - {0}", 
      ((VerifyFolderCreate()) ? "Passed" : "Failed"));
    permissionItem.Enabled = 
      ((permissionItem.Text.Contains("Passed")) ? true : false);
    blPermissions.Items.Add(permissionItem);
    intValidItems = intValidItems + 
      ((permissionItem.Text.Contains("Passed")) ? 1 : 0);

    //FolderDelete
    permissionItem = new ListItem();
    permissionItem.Text = String.Format("Folder Delete - {0}", 
      ((VerifyFolderCreate()) ? "Passed" : "Failed"));
    permissionItem.Enabled = 
      ((permissionItem.Text.Contains("Passed")) ? true : false);
    blPermissions.Items.Add(permissionItem);
    intValidItems = intValidItems + 
      ((permissionItem.Text.Contains("Passed")) ? 1 : 0);

    lblPermissionCheck.Text = String.Format("Permissions {0}", 
      ((intValidItems == 4) ? "Passed" : "Failed"));
    lblPermissionCheck.BackColor = 
      ((intValidItems == 4) ? Color.Green : Color.Red);

    // Show the Continue button?
    btnPermissionsNext.Visible = ((intValidItems == 4) ? true : false);
}

下一个屏幕允许用户配置数据库连接并对其进行测试

LINQ to SQL 提供了一个 DatabaseExists() 方法,可以轻松地指示连接是否有效

private bool CanConnectToDatabase()
{
    string strUserInfo = (!chkIntegrated.Checked) ? 
      String.Format("Persist Security Info=True;User ID={0};Password={1}", 
      this.txtUserId.Text, this.txtPassword.Text) : "Integrated Security=True";
    strConnection = String.Format("Data Source={0};Initial Catalog={1};{2}", 
      this.txtServer.Text, this.txtDatabase.Text, strUserInfo);

    DataClassesDataContext DataClassesDataContext = 
       new DataClassesDataContext(strConnection);

    return DataClassesDataContext.DatabaseExists();
}

如果连接确实存在,它将存储在web.config

if (boolCanConnectToDatabase)
{
    System.Configuration.Configuration rootWebConfig = 
      System.Web.Configuration.WebConfigurationManager.
        OpenWebConfiguration(Request.ApplicationPath);
    System.Configuration.ConnectionStringSettings connString;
    if (rootWebConfig.ConnectionStrings.ConnectionStrings.Count > 0)
    {
        connString = 
          rootWebConfig.ConnectionStrings.ConnectionStrings[
          "WebInstallerConnectionString"];

        if (connString != null)
        {
            connString.ConnectionString = strConnection;
            rootWebConfig.Save();
        }

    }
}

向导的下一页检查是否已创建 Users 表(该人员可能只是在移动 SQL server 后运行该向导来修复web.config)。 如果该表存在,它允许用户移动到下一步。 如果它不存在,它会指示“继续”按钮将运行.sql设置脚本。

#region Database Set-up
private void SetupDatabase()
{
    DatabaseReady = TableExists();
    lblDatabaseSetup.Text = (DatabaseReady) ? 
     "The Database is already set-up. Click continue." 
     : "Click the Continue button to run the database set-up scripts.";
}

private bool TableExists()
{
    bool CanConnect = true;

    try
    {
        DataClassesDataContext DataClassesDataContext = 
                               new DataClassesDataContext();

        var result = from Users in DataClassesDataContext.Users
                      select Users;
        int intCount = result.Count();

    }
    catch (Exception e)
    {
        string strError = e.Message;
        CanConnect = false;
    }

    return CanConnect;
}

protected void btnDatabaseSetupNext_Click(object sender, EventArgs e)
{
    if (!TableExists())
    {
        try
        {
            string strSqlScript = GetSQLScript();
            DataClassesDataContext DataClassesDataContext = 
                                   new DataClassesDataContext();
            DataClassesDataContext.ExecuteCommand(strSqlScript);
        }
        catch (Exception ex)
        {
            lblDatabaseSetup.Text = ex.Message;
            return;
        }
    }

    mvSetupWizard.SetActiveView(vwComplete);
}

private String GetSQLScript()
{
    string strSQLScript;
    string strFilePath = MapPath(@"~/SQLScripts/Setup.sql");
    StreamReader reader = new StreamReader(strFilePath);
    strSQLScript = reader.ReadToEnd();
    reader.Close();
    reader = null;
    return strSQLScript;
}
#endregion

向导的最后一页包含一个按钮,可将用户返回到应用程序的第一个页面

现在,程序检测到应用程序已正确设置

关注点

  • 用户必须在运行向导之前创建数据库。 虽然您可以在设置时创建数据库,但大多数共享主机服务器不允许您拥有此权限。 要求事先设置数据库在所有情况下都有效。
  • 此设置不支持文件模式下的 SQL Server Express。 DotNetNuke 安装向导支持,因此您可以在 DotNetNuke 源代码中找到执行该操作的代码。
  • 此向导仅支持 Microsoft SQL server。 示例脚本仅适用于 SQL Server 2005。 可以对其进行修改以支持 SQL Server 2000。

更新

  • 我在原始代码中打开了一个流读取器,但没有关闭它! 坏程序员! 现在修复了。
基于 Web 的应用程序配置向导 - CodeProject - 代码之家
© . All rights reserved.