我正在研究用C#/ .NET编写的RESTful API,需要在生产数据库和开发数据库之间切换以测试新的API调用。以前的首席开发人员API没有任何意义,所以我们在从头开始重建应用程序之前替换它的最重要部分。
我需要动态切换到开发人员数据库服务器的SqlMembershipProvider
来测试用户帐户的CRUD操作。
MSDN"文档"说Membership.CreateUser
method calls SqlMembershipProvider.CreateUser
,但调用此基础方法会直接返回null
并将status
输出设置为invalidAnswer
。
我在Web.config
中配置了连接字符串和提供程序定义:
<connectionStrings>
<add name="ConnString" connectionString="server=prodblahblah">
<add name="DevConnString" connectionString="server=devblahblah">
...
<membership defaultProvider="SQLDBMembershipProvider">
<providers>
<add name="SQLDBMembershipProvider" connectionStringName="ConnString" requiresQuestionAndAnswer="false" ...>
<add name="DevSQLDBMembershipProvider" connectionStringName="DevConnString" requiresQuestionAndAnswer="false" ...>
根据我发现分散在互联网上的一些建议,我提出并尝试了以下内容:
SqlMembershipProvider p = (SqlMembershipProvider)Membership.Providers["DevSQLDBMembershipProvider"];
MembershipCreateStatus status;
string question = "";
string answer = "";
MembershipUser mu = p.CreateUser(username, password, email, question, answer, true, Guid.NewGuid(), out status);
调用返回null并将输出status
变量设置为invalidAnswer
。这让我感到困惑,因为requiresQuestionAndAnswer
在配置中设置为false
,而调用Membership.CreateUser
会导致aspnet_Membership
表中的空值。
奇怪的是,在使用Membership.Providers["SQLDBMembershipProvider"]
而不是["DevSQLDBMembershipProvider"]
时,我得到了相同的结果,因此Membership.CreateUser
和SqlMembershipProvider.CreateUser
处理密码问题的方式必须有所不同答案。
SqlMembershipProvider.CreateUser的MSDN文档中给出的代码示例实际上甚至没有显示如何使用SqlMembershipProvider.CreateUser
- 而是调用Membership.CreateUser
而未提及如何访问非Web.config文件中配置的默认提供程序。方法文档中的代码示例没有特别说明如何使用该方法。我认为可以公平地说,MSDN拥有我见过的最令人生气的无用文档。
为什么Membership.CreateUser
使用空密码问题/答案值而SqlMembershipProvider.CreateUser
没有?我该如何解决这个问题?
答案 0 :(得分:1)
我在写这个问题时想出了答案。由于很难在任何地方找到这些东西的文档,我决定发布问题并用我的发现回答它。
事实证明""
是null
不被接受。当null
可接受时,空字符串无效。当然,这对每个人都很有意义。本质上直观的是,空字符串是不可接受的,而空字符串是可接受的。明显。
微软以其无限的智慧决定不在他们的代码示例中展示如何使用他们的代码的示例,这绝对是一件好事。毕竟,他们是专业人士,这就是文档的工作方式。