在调用Web.config中的连接字符串时出现非法字符异常

3

我正在创建一个使用实体框架的C# MVC4.5项目,并在Web.config中设置以下连接字符串:

<connectionStrings>
    <add name="Entities" 
         connectionString="metadata=res://*/PersistenceModel.csdl|res://*/PersistenceModel.ssdl|res://*/PersistenceModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\sqlexpress;initial catalog=TravPro;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 
         providerName="System.Data.EntityClient" /> 
</connectionStrings>

我可以这样访问该字符串:

string con = ConfigurationManager.ConnectionStrings["Entities"].ConnectionString;
WebSecurity.InitializeDatabaseConnection(con,
                                         "UserProfile", 
                                         "UserId", 
                                         "UserName", 
                                         true);

这会抛出一个“路径中包含非法字符”的异常:

[ArgumentException: Illegal characters in path.]
   System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional) +10631190
   System.IO.Path.Combine(String path1, String path2) +42
   WebMatrix.Data.ConfigurationManagerWrapper.GetConnection(String name, Func`2 getConfigConnection, Func`2 fileExists) +208
   WebMatrix.Data.ConfigurationManagerWrapper.GetConnection(String name) +91
   WebMatrix.Data.Database.OpenNamedConnection(String name, IConfigurationManager configurationManager) +18
   WebMatrix.Data.Database.Open(String name) +61
   WebMatrix.WebData.DatabaseConnectionInfo.Connect() +42
   WebMatrix.WebData.SimpleMembershipProvider.ConnectToDatabase() +25
   WebMatrix.WebData.SimpleMembershipProvider.CreateTablesIfNeeded() +35
   WebMatrix.WebData.WebSecurity.InitializeMembershipProvider(SimpleMembershipProvider simpleMembership, DatabaseConnectionInfo connect, String userTableName, String userIdColumn, String userNameColumn, Boolean createTables) +73
   WebMatrix.WebData.WebSecurity.InitializeProviders(DatabaseConnectionInfo connect, String userTableName, String userIdColumn, String userNameColumn, Boolean autoCreateTables) +51
   WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection(String connectionStringName, String userTableName, String userIdColumn, String userNameColumn, Boolean autoCreateTables) +51
   TravPro.Web.Filters.SimpleMembershipInitializer..ctor() in c:\Work\trunk\TravPro\TravPro.Web\Filters\InitializeSimpleMembershipAttribute.cs:43

请问有人可以帮忙并告诉我哪些字符需要转义或如何解决这个异常吗?

3个回答

3
你所存储的连接字符串是为Entity Framework准备的,它不是“常规”的ADO.NET连接字符串。 Entity Framework连接字符串确实包含一个常规的ADO.NET连接字符串(在provider connection string = .....内部的位) - 但还有其他的东西。
另一方面,WebSecurity需要一个常规的ADO.NET连接字符串作为输入 - 而不是Entity Framework连接字符串。
因此,要解决此问题,您需要在配置文件中的部分中添加第二个连接字符串用于WebSecurity:
<connectionStrings>
    <add name="Entities" 
         connectionString="metadata=res://*/PersistenceModel.csdl|res://*/PersistenceModel.ssdl|res://*/PersistenceModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\sqlexpress;initial catalog=TravPro;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 
         providerName="System.Data.EntityClient" />
    <add name="RegularADONET" 
         connectionString="data source=.\sqlexpress;initial catalog=TravPro;integrated security=True;MultipleActiveResultSets=True;" 
</connectionStrings>

然后使用第二个“常规”的 ADO.NET 连接字符串来为 WebSecurity 提供支持:

string con = ConfigurationManager.ConnectionStrings["RegularADONET"].ConnectionString;
WebSecurity.InitializeDatabaseConnection(con, "UserProfile", "UserId", "UserName", true);

1

我按照您的方法尝试了(@marc_s),但仍然遇到问题,尽管它确实指引了我找到解决方案的方向。我将connectionStrings更改为:

<connectionStrings>
    <add name="DefaultConnection"
         connectionString="data source=.\sqlexpress;initial catalog=TravPro;integrated security=True;MultipleActiveResultSets=True;"
         providerName="System.Data.SqlClient" />
    <add name="Entities"
         connectionString="metadata=res://*/PersistenceModel.csdl|res://*/PersistenceModel.ssdl|res://*/PersistenceModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\sqlexpress;initial catalog=TravPro;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"
         providerName="System.Data.EntityClient" />
</connectionStrings>

现在一切似乎都很顺利。我创建了一个新的项目模板,运行它,并看到了连接字符串格式的差异。

现在我的InitializeSimpleMembershipAttribute.cs中包含以下内容:

WebSecurity.InitializeDatabaseConnection("DefaultConnection", 
                                         "UserProfile", 
                                         "UserId", 
                                         "UserName", 
                                         true);

感谢您指引我正确的方向。
非常感激。

0
我能看到的唯一问题可能是你的“字符” - 尝试使用单引号代替。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接