1

尝试使用SimpleMembership初始化我的数据库连接时出现此错误消息。第一个初始化语句经过,而第二个初始化语句没有。目标是在运行Azure模拟器或部署时使用在Azure服务配置中定义的连接字符串。WebSecurity.InitializeDatabaseConnection上密钥'attachdbfilename'的值无效

Web.config文件:

<connectionStrings> 
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-**********;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-**********.mdf" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

天青.cscfg配置文件:

<Setting name="SqlConnectionString" value="Server=Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-********;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-********.mdf" /> 

SimpleMembershipInitializer:

string connectionStringName = "DefaultConnection"; 
string connectionString = CloudConfigurationManager.GetSetting("SqlConnectionString"); 
const string userTableName = "UserProfile"; 
const string providerName = "System.Data.SqlClient"; 
const string userIdColumn = "UserId"; 
const string userNameColumn = "UserName"; 

// This works fine. 
// WebSecurity.InitializeDatabaseConnection(connectionStringName, userTableName, userIdColumn, userNameColumn, autoCreateTables: true); 

// This throws exception. 
// WebSecurity.InitializeDatabaseConnection(connectionString, providerName, userTableName, userIdColumn, userNameColumn, autoCreateTables: true); 

环境:具有默认SimpleMembership结构的Visual Studio 2012,EntityFramework 5.0和MVC4 RTM。

完整堆栈跟踪:

[ArgumentException: Invalid value for key 'attachdbfilename'.] 
    System.Data.SqlClient.SqlConnectionString.VerifyLocalHostAndFixup(String& host, Boolean enforceLocalHost, Boolean fixup) +888986 
    System.Data.SqlClient.SqlConnectionString..ctor(String connectionString) +5330002 
    System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous) +24 
    System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions) +167 
    System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key) +61 
    System.Data.SqlClient.SqlConnection.set_ConnectionString(String value) +66 
    WebMatrix.Data.DbProviderFactoryWrapper.CreateConnection(String connectionString) +96 
    WebMatrix.Data.<>c__DisplayClass15.<OpenConnectionStringInternal>b__14() +16 
    WebMatrix.Data.Database.get_Connection() +19 
    WebMatrix.Data.Database.EnsureConnectionOpen() +12 
    WebMatrix.Data.<QueryInternal>d__0.MoveNext() +66 
    System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source) +164 
    WebMatrix.Data.Database.QuerySingle(String commandText, Object[] args) +103 
    WebMatrix.WebData.DatabaseWrapper.QuerySingle(String commandText, Object[] parameters) +14 
    WebMatrix.WebData.SimpleMembershipProvider.CheckTableExists(IDatabase db, String tableName) +57 
    WebMatrix.WebData.SimpleMembershipProvider.CreateTablesIfNeeded() +49 
    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 connectionString, String providerName, String userTableName, String userIdColumn, String userNameColumn, Boolean autoCreateTables) +63 
    MyProject.Filters.SimpleMembershipInitializer..ctor() in c:\Repos\MyRepo\trunk\Web\MyProject\Filters\InitializeSimpleMembershipAttribute.cs:55 

[InvalidOperationException: The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588] 
    MyProject.Filters.SimpleMembershipInitializer..ctor() in c:\Repos\MyRepo\trunk\Web\MyProject\Filters\InitializeSimpleMembershipAttribute.cs:59 

[TargetInvocationException: Exception has been thrown by the target of an invocation.] 
    System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 
    System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +113 
    System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232 
    System.Activator.CreateInstance(Type type, Boolean nonPublic) +83 
    System.Activator.CreateInstance(Type type) +6 
    System.Threading.LazyHelpers`1.ActivatorFactorySelector() +68 
    System.Threading.LazyInitializer.EnsureInitializedCore(T& target, Boolean& initialized, Object& syncLock, Func`1 valueFactory) +115 
    System.Threading.LazyInitializer.EnsureInitialized(T& target, Boolean& initialized, Object& syncLock) +106 
    MyProject.Filters.InitializeSimpleMembershipAttribute.OnActionExecuting(ActionExecutingContext filterContext) in c:\Repos\MyRepo\trunk\Web\MyProject\Filters\InitializeSimpleMembershipAttribute.cs:23 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.InvokeActionMethodFilterAsynchronously(IActionFilter filter, ActionExecutingContext preContext, Func`1 nextInChain) +69 
    System.Web.Mvc.Async.<>c__DisplayClass3b.<BeginInvokeActionMethodWithFilters>b__35() +21 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.InvokeActionMethodFilterAsynchronously(IActionFilter filter, ActionExecutingContext preContext, Func`1 nextInChain) +489 
    System.Web.Mvc.Async.<>c__DisplayClass3b.<BeginInvokeActionMethodWithFilters>b__35() +21 
    System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__31(AsyncCallback asyncCallback, Object asyncState) +191 
    System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters, AsyncCallback callback, Object state) +197 
    System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState) +446 
    System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +302 
    System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState) +30 
    System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 
    System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +382 
    System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 
    System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +317 
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +15 
    System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) +71 
    System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +249 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 

回答

0

我没有一个解决办法,但这里是我自己的调查和理论至今:

我看了看WebSecurity的源代码.InitializeDatabaseConnection()并认为也许我找到了一个错误。它似乎没有设置DatabaseConnectionInfo.Type属性,该属性默认为ConnectionStringName,这可以解释为什么它不喜欢我的连接字符串,因为它会将它解释为连接字符串名称。

WebSecurity类:

public static void InitializeDatabaseConnection(string connectionString, string providerName, string userTableName, string userIdColumn, string userNameColumn, bool autoCreateTables) 
{ 
    WebSecurity.InitializeProviders(new DatabaseConnectionInfo() 
    { 
    ConnectionString = connectionString, 
    ProviderName = providerName 
    }, userTableName, userIdColumn, userNameColumn, autoCreateTables); 
} 

DatabaseConnectionInfo类:

public Database Connect() 
{ 
    switch (this.Type) 
    { 
    case DatabaseConnectionInfo.ConnectionType.ConnectionStringName: 
     return Database.Open(this.ConnectionStringName); 
    case DatabaseConnectionInfo.ConnectionType.ConnectionString: 
     return Database.OpenConnectionString(this.ConnectionString, this.ProviderName); 
    default: 
     return (Database) null; 
    } 
} 

private enum ConnectionType 
{ 
    ConnectionStringName, 
    ConnectionString, 
} 
+0

我可以确认OP观察到的行为。对于任何遇到这种情况的人来说,尽管可以传递API参数名称_either_a_connection string_或_connection字符串name_,但不幸的是,它似乎只能处理连接字符串名称。最终结果是,对于使用Azure CloudConfigurationManager来解析该值的简单成员资格API的当前版本而言,它似乎不可能。我的目标是消除Web.config中的连接字符串设置,但不成功。 –

1

在我看来,你可能会因为缺乏双逃逸患上(做\\v11.0而不是\v11.0)如在this post中讨论的那样。

+0

我看到我的问题不准确,我没有在C#中创建连接字符串。它被定义为Azure部署配置文件中的一个键值。所以这不幸的是不相关。我会加倍努力,谢谢。 – angularsen

+0

谢谢。我很高兴你在下面想到了。 –

1

我很惭愧地意识到我的连接字符串中有一个错字。我正从Azure的部署配置文件中的连接字符串,如:

<Setting name="SqlConnectionString" value="Server=Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-********;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-********.mdf" /> 

错字在这里包括,在值字符串的开头。它一定是一个副本''''的错误。

此字符串在Azure配置文件Local.cscfg和Cloud.cscfg中分别用于Azure模拟器和Azure部署以及用于在本地外部模拟器上运行的web.config中复制。错字只出现在Local.cscfg文件中,当我试图弄清楚为什么它在某些情况下不起作用时,我很困惑。此外,由于某种原因,拼写错误很难让我发现。事后看来,我不明白我怎么没有早点知道。