【问题标题】:Illegal characters exception when calling connection string in Web.config在 Web.config 中调用连接字符串时出现非法字符异常
【发布时间】:2013-01-02 07:35:16
【问题描述】:

我正在使用实体框架创建一个 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

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

【问题讨论】:

    标签: c# .net entity-framework asp.net-mvc-4


    【解决方案1】:

    您存储的连接字符串用于 Entity Framework - 它不是“常规”ADO.NET 连接字符串。 Entity Framework 连接字符串确实包含一个常规的 ADO.NET 连接字符串(provider connection string=..... 中的位) - 但除此之外还有更多内容。

    另一方面,

    WebSecurity 需要 常规 ADO.NET 连接字符串作为输入 - 不是实体框架连接字符串。

    因此,要解决此问题,您需要在配置文件中的 &lt;connectionStrings&gt; 部分添加第二个 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>
    

    然后为WebSecurity 使用第二个“常规”ADO.NET 连接字符串:

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

    【讨论】:

      【解决方案2】:

      我按照你的方式尝试过 (@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);
      

      感谢您为我指明正确的方向。
      非常喜欢。

      【讨论】:

        【解决方案3】:

        我能看到的唯一问题可能是您的 " 字符 - 请尝试使用单引号

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-11
          • 2010-12-14
          相关资源
          最近更新 更多