Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 类库中的Membership.CreateUser()_.net_Class_Asp.net Membership - Fatal编程技术网

.net 类库中的Membership.CreateUser()

.net 类库中的Membership.CreateUser(),.net,class,asp.net-membership,.net,Class,Asp.net Membership,我正在将代码从App\u code移到类库中 我使用Membership.CreateUser以编程方式创建用户 在无法访问我在web.config中配置的成员资格提供程序的情况下,如何在类库中继续执行此操作?向类中的System.web.Security命名空间添加using指令-这将使您可以直接访问成员资格类 C#: VB.NET: Imports System.Web.Security 您可以在任何地方访问它,因为成员资格类是ASP.NET提供程序系统设置的当前提供程序的静态表示。我通过

我正在将代码从
App\u code
移到类库中

我使用
Membership.CreateUser
以编程方式创建用户


在无法访问我在
web.config
中配置的成员资格提供程序的情况下,如何在类库中继续执行此操作?

向类中的
System.web.Security
命名空间添加using指令-这将使您可以直接访问
成员资格

C#:

VB.NET:

Imports System.Web.Security

您可以在任何地方访问它,因为成员资格类是ASP.NET提供程序系统设置的当前提供程序的静态表示。

我通过将整个web.config复制到我的app.config解决了我的问题。我使用的是一个控制台应用程序。我以为我已经复制了必要的部分,但直到我复制了所有内容,在我向您展示代码部分的工作原理之前,数据并没有进入数据库

——您需要了解在这种情况下设置是如何加载的

当您有一个Web应用程序要加载您的
.dll
文件,并且该
.dll
文件要访问应用程序配置的
成员资格提供程序时,您必须做一些假设

  • Web应用程序有一个
    成员资格提供程序
  • Web应用程序在其
    Web.Config
  • Web应用程序将正确加载
    .dll
  • 由于
    .dll
    文件应包含在Web应用程序的
    /bin
    目录中,因此您应该能够依赖Web应用程序的配置,而不必提供自己的配置

    为此,请从Oded在回答中提到的内容开始—在
    .dll
    的代码中创建对
    System.Web.Security
    的引用—然后在该文件中执行以下操作:

    if (Membership.Provider != null) {
        Membership.Provider.CreateUser( ... );
    } else {
        // Do something appropriate in a case where there is no Membership Provider
    }
    
    此时-如果上述操作不起作用,很可能是因为您的Web应用程序没有配置适当的提供程序

    关于为什么要这样做的说明…

    您应该让Web应用程序提供配置的原因是为了遵守以下原则:。是一个提供默认功能的抽象类,实现很少

    换句话说,它定义了要管理成员,您需要能够执行诸如
    CreateUser()
    GetAllUsers()
    之类的操作。它还说,您应该能够配置设置,例如指定
    密码格式
    ,并确定每个用户
    是否需要电子邮件

    它没有告诉你在哪里存储用户信息。它将这留给实现者(
    System.Web.Providers.DefaultMembershipProvider
    YourNS.YourMembershipProvider

    然后,使用
    成员资格提供程序的应用程序将确定要提供的设置以及要使用的实现。换句话说,
    YourNS.YourMembershipProvider
    负责指定信息的管理方式,但很可能是应用程序决定在其存储中使用什么
    ConnectionString
    ,等等

    因此-按照我上面概述的模式,您可以提供三个独立的层:

  • 将使用
    成员资格提供程序的应用程序
  • 提供
    成员身份提供程序
    实现的程序集,以及
  • 一个程序集,它使用已配置的
    成员身份提供程序
    ,并代表应用程序对其进行处理(*我相信这就是您在文章中描述的层)

  • 请注意,如果遵循此模式,您现在可以稍后切换
    成员资格提供程序
    ,而无需更改其他任何一个层,因为这些层依赖于
    成员资格提供程序
    的基类,而不是依赖于您的特定实现。这可能非常有价值。

    已经可以访问成员类了。因为在类库中它无法读取web.config,所以它似乎使用了一些默认的提供程序,而不是我在web.config文件中配置的SQL Server。@Chris-类库将在某些上下文下运行-它将有权访问在其下运行的应用程序的配置。在我的类库中,我将调用:
    MembershipUser NewUser=Membership.CreateUser(用户名、密码、电子邮件、“无问题”、“无答案”、true、out createStatus)在默认情况下是不可接受的(无非alpha),但应用程序的web.config有以下内容:
    ,因此如果读取上述内容,它将接受“wonder123”作为密码,相反,我得到的是createStatus.InvalidPassword。您的asp.net应用程序中有一个类,但它无法访问web.config中的信息?它在一个有自己的web.config的文件夹中吗?很高兴它有帮助。:)我已经在不同的项目中做过很多次了——我记得最初几次,弄清楚运动部件是多么令人沮丧。
    if (Membership.Provider != null) {
        Membership.Provider.CreateUser( ... );
    } else {
        // Do something appropriate in a case where there is no Membership Provider
    }