【问题标题】:How do you modify a Web Setup Project to create a new website, app pool and virtual directory?如何修改 Web 设置项目以创建新网站、应用程序池和虚拟目录?
【发布时间】:2014-07-03 15:29:58
【问题描述】:

在过去的几天里,我已经阅读了很多关于这方面的信息,似乎有很多关于如何创建 Web 设置项目并使用自定义操作等进行修改的信息。我已经到目前为止,使用以下链接:

http://weblogs.asp.net/scottgu/tip-trick-creating-packaged-asp-net-setup-programs-with-vs-2005 http://msdn.microsoft.com/en-us/library/ms525598.aspx http://www.dreamincode.net/forums/topic/231074-setup-and-deployment-in-visual-studio-2010/ http://www.codeproject.com/Articles/146626/Extending-Visual-Studio-Setup-Project

但是,关于如何专门修改用户界面以便用户可以创建站点而不是从“安装”中提供的下拉列表中进行选择,似乎没有太多内容地址”操作(在“开始”下)。除此之外,我还遇到了有关如何创建新应用程序池的代码,但没有遇到如何阻止 UI 为用户提供先从列表中选择 1 的选项。

目前我的安装程序看起来像这样:

如您所见,用户当前有 3 个字段;站点、虚拟目录和应用程序池。站点和应用程序池是其中包含现有选项的列表。在站点下拉列表的情况下,我实际上希望这是一个文本框,允许用户输入他们希望创建的网站的名称。对于应用程序池,我希望它完全消失,因为我的自定义操作会自动创建一个应用程序池并将虚拟目录分配给它(希望如此)。

我已经有了用于创建应用程序池、虚拟目录并将其分配给应用程序池的代码(尚未测试),但我看不到如何根据需要编辑 UI。我是否需要删除“安装地址”步骤并创建自己的自定义步骤?

以下代码用于应用程序池创建、虚拟目录创建和虚拟目录分配到应用程序池:

//Properties for user input
private string targetSite { get { return this.Context.Parameters["targetsite"]; }}
private string targetVirtualDir { get { return this.Context.Parameters["targetvdir"]; } }
private string targetDirectory { get { return this.Context.Parameters["targetdir"]; } }
private const string ApplicationPool = "TestWebAppAP";
private const string BasePath = "IIS://Localhost/W3SVC/1/Root";
private const string AppPoolsAddress = "IIS://Localhost/W3SVC/AppPools";

//Install
public override void Install(System.Collections.IDictionary stateSaver)
{
    base.Install(stateSaver);

    if (targetSite == null) throw new InstallException("IIS site name not specified");
    else
    {
        CreateApplicationPool();
        CreateVirtualDir();
        AssignVDirtoAppPool();
    }
}

//Create Application Pool
private void CreateApplicationPool()
{
    try
    {
        DirectoryEntry NewPool;
        DirectoryEntry AppPools = new DirectoryEntry(AppPoolsAddress);
        NewPool = AppPools.Children.Add(ApplicationPool, "IIsApplicationPool");
        NewPool.CommitChanges();
    }
    catch (Exception ex)
    {
        MessageBox.Show("Failed to create new application pool \" " + ApplicationPool + "\". Error: " + ex.Message);
        throw new InstallException("Failed to create app pool", ex);
    }
}

//Create Virtual Directory
private void CreateVirtualDir()
{
    try
    {
        DirectoryEntry site = new DirectoryEntry(BasePath);
        string className = site.SchemaClassName.ToString();

        if (className.EndsWith("Server") || className.EndsWith("VirtualDir"))
        {
            DirectoryEntries vdirs = site.Children;
            DirectoryEntry newVDir = vdirs.Add(targetVirtualDir, (className.Replace("Service", "VirtualDir")));
            newVDir.Properties["Path"][0] = targetDirectory;
            newVDir.Properties["AccessScript"][0] = true;
            newVDir.Properties["AppFriendlyName"][0] = targetVirtualDir;
            newVDir.Properties["AppIsolated"][0] = "1";
            newVDir.Properties["AppRoot"][0] = "/LM" + BasePath.Substring(BasePath.IndexOf("/", ("IIS://".Length)));

            newVDir.CommitChanges();
        }
        else
        {
            MessageBox.Show("Failed to create virtual directory. It can only be created in a site or virtual directory node.");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Failed to create virtual directory \"" + targetVirtualDir + "\". Error: " + ex.Message);
        throw new InstallException("Failed to create virtual directory", ex);
    }
}

//Assign virtual directory to app pool
private void AssignVDirtoAppPool()
{
    try
    {
        DirectoryEntry vDir = new DirectoryEntry(BasePath);
        string className = vDir.SchemaClassName.ToString();

        if(className.EndsWith("VirtualDir"))
        {
            object[] param = { 0, ApplicationPool, true };
            vDir.Invoke("AppCreate3", param);
            vDir.Properties["AppIsolated"][0] = "2";
        }
        else
        {
            MessageBox.Show("Failed to assign to application pool. Only virtual directories can be assigned to application pools.");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Failed to assign virtual directory \"" + targetVirtualDir + "\" to application pool \"" + ApplicationPool + "\". Error: " + ex.Message);
        throw new InstallException("Failed to assign virtual directory to application pool", ex);
    }
}

【问题讨论】:

    标签: c# iis application-pool web-setup-project


    【解决方案1】:

    我发现我可以删除 UI 中的“安装地址”并使用文本框进行自定义。这似乎有点限制,但这是我能做到的唯一方法。

    【讨论】:

    • 我创建了一个 Web 设置以将我的网站部署到 IIS,但奇怪的是站点下拉菜单和应用程序池下拉菜单没有显示在安装程序中。它们是默认存在的,还是我们需要做一些特殊的事情才能让这些下拉菜单出现在安装向导中?
    • @user2913184 如果他们不在那里,您将不得不创建一个自定义的。
    • 其实我也是这么想的,不过谢谢你的帮助。
    猜你喜欢
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    相关资源
    最近更新 更多