我有一个包含Web.Config的Web项目。部署该配置时,在部署(到Azure)VS修改该配置内的设置(ClientId)。
<appSettings>
<add key="ClientId" value="123456123-beef-face-96ce-12346dd8a108" />
</appSettings>
现在我还有一个控制台应用程序需要使用从Web应用程序部署创建的相同ClientId。更糟糕的是:我不仅需要设置中的值,而且还必须在App.config(appSettings / ClientId)中使用相同的结构。两个项目都在同一个解决方案中。
在构建/部署时,有没有办法使用相同的配置或自动将设置从一个配置复制到另一个配置?
答案 0 :(得分:1)
有两种方法可以做到这一点:
首先:
configSource
属性[Test]
public void Publish_News_Post_From_File_Test()
{
using (AppConfig.Change(@"otherFile.dll.config"))
{
//Now use other config file
}
}
使用其他文件中的设置
第二个(代码很好并且编译)
像这样使用:
public abstract class AppConfig : IDisposable
{
public static AppConfig Change(string path)
{
return new ChangeAppConfig(path);
}
public abstract void Dispose();
private class ChangeAppConfig : AppConfig
{
private readonly string oldConfig =
AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString();
private bool disposedValue;
public ChangeAppConfig(string path)
{
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path);
ResetConfigMechanism();
}
public override void Dispose()
{
if (!disposedValue)
{
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfig);
ResetConfigMechanism();
disposedValue = true;
}
GC.SuppressFinalize(this);
}
private static void ResetConfigMechanism()
{
typeof(ConfigurationManager)
.GetField("s_initState", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, 0);
typeof(ConfigurationManager)
.GetField("s_configSystem", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, null);
typeof(ConfigurationManager)
.Assembly.GetTypes()
.Where(x => x.FullName ==
"System.Configuration.ClientConfigPaths")
.First()
.GetField("s_current", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, null);
}
}
}
源代码:
using
在Public Function get_remoteTables(strPath As String)
Dim objFSO As FileSystemObject
Dim objFolder As Folder
Dim objFiles As file
Dim filedetails() As Variant
Dim FileCount As Long
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strPath)
' Grab all the files in the subfolders
For Each objSubFolder In objFolder.SubFolders
'print folder path
Debug.Print (objSubFolder.Path)
Set objFiles = objFSO.GetFolder(objSubFolder.Path).Files
If Err.Number <> 0 Then
FileCount = 0
Else
FileCount = objFiles.Count
End If
get_Filenames (objSubFolder.Path)
Next objSubFolder
End Function
Sub test()
Call get_remoteTables("C:\temp\ ")
End Sub
stetment中您可以使用其他配置文件。我在测试项目中使用它来使用生产web.config
答案 1 :(得分:0)
我使用另一种使用Powershell的方法(作为后期构建)找到了一个解决方案:
$webconfig='C:\dev\mySolution\myWebProject\Web.config'
$appConfig='C:\dev\mySolution\myConsoleApp\App.config'
#Get Value from Web.Config:
$webconfigDoc=New-Object System.Xml.XmlDocument
$webconfigDoc.Load($webconfig)
$webappsettings=$webconfigDoc.SelectSingleNode('//appSettings')
$webclientIdNode=$webappsettings.SelectSingleNode("//add[@key='ClientId']")
$clientId=$webclientIdNode.value
#Set Value into App.Config:
$appconfigDoc=New-Object System.Xml.XmlDocument
$appconfigDoc.Load($appConfig)
$appsettings=$appconfigDoc.SelectSingleNode('//appSettings')
$appclientIdNode=$appsettings.SelectSingleNode("//add[@key='ClientId']")
$appclientIdNode.value=$clientId
$appconfigDoc.Save($appConfig)