2

我需要在 app.config 中创建一个地址字符串:

<client>
       <endpoint address="http://ServerName/xxx/yyy.svc"
                    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IClientIInfoService"
                    contract="DocuHealthLinkSvcRef.IClientIInfoService" name="BasicHttpBinding_IClientIInfoService" />
</client>

ServerName需要用户在安装时输入。为此,我在安装程序中创建了一个新的 UI 对话框。我还写了一个Installer.cs类并覆盖了install ()

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

            base.Install(stateSaver);

            string targetDirectory = Context.Parameters["targetdir"];

            string ServerName = Context.Parameters["ServerName"];

            System.Diagnostics.Debugger.Break();

            string exePath = string.Format("{0}myapp.exe", targetDirectory);

           Configuration config = ConfigurationManager.OpenExeConfiguration(exePath);

            config.AppSettings.Settings["ServerName"].Value = ServerName;

            config.Save();
        }
    }

但是我如何在我的中使用它ServerNameapp.config创建指定的字符串。我正在开发 VS2010。

4

5 回答 5

5

您可以使用WiX(Windows Installer XML 工具集)来构建您的 MSI,在这种情况下,您可以使用XmlFile实用程序标签来更新服务器名称:

  <util:XmlFile Id="UpdateServerName" File="[INSTALLLOCATION]AppName.exe.config" Action="setValue" ElementPath="/client/endpoint" Name="address" Value="http://[SERVERNAME]/xxx/yyy.svc" />

您可以在安装期间使用WixUI扩展表单捕获服务器名称。

WiX 的优点:WiX 与 msbuild 兼容(与 .vdproj 文件不同),并为您提供对安装程序的更细粒度的控制

于 2013-01-11T04:33:37.320 回答
3

假设您在 app.config 中使用完整的 ServiceModel 部分组

基本上你遵循以下步骤:

  1. 加载 ServiceModel 配置部分
  2. 获取客户部分
  3. 获取 ChannelEndpoint 元素
  4. 通过用输入的值替换字符串“ServerName”来更改地址值
  5. 将地址属性设置为新值
  6. 保存配置

    public override void Install(System.Collections.IDictionary stateSaver)
    {
    
        base.Install(stateSaver);  
    
        string targetDirectory = Context.Parameters["targetdir"];  
    
        string ServerName = Context.Parameters["ServerName"];  
    
        System.Diagnostics.Debugger.Break();  
    
        string exePath = string.Format("{0}myapp.exe", targetDirectory);  
    
        Configuration config = ConfigurationManager.OpenExeConfiguration(exePath);  
    
        config.AppSettings.Settings["ServerName"].Value = ServerName;  
    
        //Get ServiceModelSectionGroup from config  
        ServiceModelSectionGroup group = ServiceModelSectionGroup.GetSectionGroup  (config);
    
        //get the client section
        ClientSection clientSection = group.Client;
    
        //get the first endpoint
        ChannelEndpointElement channelEndpointElement = clientSection.Endpoints[0];
    
        //get the address attribute and replace servername in the string.
        string address = channelEndpointElement.Address.ToString().Replace("ServerName", ServerName);
    
        //set the Address attribute to the new value
        channelEndpointElement.Address = new Uri(address);
    
        config.Save();
    }
    
于 2013-01-07T05:36:36.650 回答
2

在一天结束时,app.configxml文件。您可以使用Linq To XMLXPathNavigator来替换元素的address属性。endpoint

下面的代码使用 Linq to Xml

    using System.Xml.Linq;
    public override void Install(System.Collections.IDictionary stateSaver)
    {

        base.Install(stateSaver);

        string targetDirectory = Context.Parameters["targetdir"];

        string ServerName = Context.Parameters["ServerName"];

        System.Diagnostics.Debugger.Break();

        string configPath = string.Format("{0myapp.exe.config", targetDirectory);

        XElement root = XElement.Load(configPath);
        var endPointElements = root.Descendants("endpoint");
        foreach(var element in endPointElements)
        {
            element.Attribute("address").Value = ServerName;
        }
        root.Save(configPath);
    }
}
于 2013-01-07T06:08:32.490 回答
2

因为你有一个 windows-installer 标签,我假设你有一个 MSI 包,或者可以创建一个......

然后:

  • 您可以创建一个公共 MSI 属性,例如安装期间需要的 ENDPOINTSERVER。
  • 添加修改 app.config 以在“InstallFinalize”之后运行的自定义操作,其值为 ENDPOINTSERVER

可以使用以下方式进行静默安装:

msiexec /i app.msi ENDPOINTSERVER=www.MyServer.com /qb-
于 2013-01-08T13:12:34.507 回答
2

在保存配置文件更改之前尝试使用以下两行:

config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("Section Name");
 root.Save(configPath);

PS:如果您使用 F5 运行它,它不会更新解决方案项“app.config”,但会更新 bin/ 文件夹中的“.exe.config”项。

于 2013-01-08T15:30:23.310 回答