36

IIS7 でサイトを作成する win フォームがあります。1 つの関数で web.config ファイルを開き、いくつかの更新を行う必要があります。(接続文字列、smtp、偽装)

ただし、物理パスだけで、仮想パスはありません。

WebConfigurationManager を引き続き使用する方法はありますか?

セクションを見つけて読み書きする機能を使用する必要があります。

System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration
4

5 に答える 5

69

physicalPath を virtualPath にマップする必要があります。これを行う方法は次のとおりです。

using System.Web.Configuration;  //Reference the System.Web DLL (project needs to be using .Net 4.0 full, not client framework)

public static Configuration OpenConfigFile(string configPath)
{
    var configFile = new FileInfo(configPath);
    var vdm = new VirtualDirectoryMapping(configFile.DirectoryName, true, configFile.Name);
    var wcfm = new WebConfigurationFileMap();
    wcfm.VirtualDirectories.Add("/", vdm);
    return WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");
}
于 2010-03-18T15:36:15.757 に答える
10

Vadim の回答は、開発サーバーではうまく機能しましたが、ライブ サーバーでは次のメッセージが表示されました。

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. Parameter name: site 

これを修正するためにWebConfigurationManager.OpenMappedWebConfiguration、IIS の Web サイト名を 3 番目のパラメーターとして受け取る別のオーバーロードを見つけました。結果は次のとおりです。

public static Configuration OpenConfigFile(string configPath)
{
    var configFile = new FileInfo(configPath);
    var vdm = new VirtualDirectoryMapping(configFile.DirectoryName, true, configFile.Name);
    var wcfm = new WebConfigurationFileMap();
    wcfm.VirtualDirectories.Add("/", vdm);
    return WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/", "iis_website_name");
}
于 2012-10-12T15:37:37.757 に答える
0

Vadimの答えに基づいて、彼が書いたものが私の状況では正確に機能しないことがわかったので、代わりにこれを使用しました:

Dim connectionSettings As New ConnectionStringSettings("mySQLite", ConnectionStringHelper.MyConnectionString)

Dim dummyVirtualPath As String = "/MyApp"
Dim virtualDirMap = New VirtualDirectoryMapping(Server.MapPath("~"), True)
Dim webConfigFileMap = New WebConfigurationFileMap()
webConfigFileMap.VirtualDirectories.Add(dummyVirtualPath, virtualDirMap)
Dim mappedConfigFile = WebConfigurationManager.OpenMappedWebConfiguration(webConfigFileMap, dummyVirtualPath)

Dim config As System.Configuration.Configuration = mappedConfigFile WebConfigurationManager.OpenWebConfiguration(Server.MapPath("~") & "/")
Dim csSection As ConnectionStringsSection = config.ConnectionStrings

If csSection.ConnectionStrings("mySQLite") IsNot Nothing AndAlso csSection.ConnectionStrings("mySQLite").ConnectionString <> connectionSettings.ConnectionString Then
    csSection.ConnectionStrings("mySQLite").ConnectionString = connectionSettings.ConnectionString
    config.Save()
    ConfigurationManager.RefreshSection(csSection.SectionInformation.Name)
End If

他の誰かが私が試みていることを試していて、これを見つけた場合に備えて、これを行う目的は、SimpleMembershipProviderから継承したExtendedMembershipProviderを SQLite で動作させることでした。これを行うには、このリンクに従ってテーブルを手動で作成しました: SimpleMembershipProvider in MVC4、次にGlobal.asaxファイルのApplication_Startルーチンでこのコマンドを使用しました:

WebSecurity.InitializeDatabaseConnection(ConnectionStringHelper.MyConnectionString, "System.Data.SQLite", "Users", "UserID", "Email", False)

実際に web.config ファイルを書き直す必要はまったくありませんでした。(私がしなければならなかった web.config の変更もたくさんありましたが、それはこの質問の範囲外です。)

于 2013-01-23T02:15:08.487 に答える