0

我有一个部署到服务器的asp.net MVC应用程序它使用表单身份验证并使用CustomSqlMembership提供程序基本上我没有更改SqlMembershipPRvider中的任何内容只是从MS复制源并将源包含在我的项目中并不时重命名它出现此错误。

这发生在本地主机和远程部署的系统上,我不知道可能是什么原因造成的。

“/”应用程序中的服务器错误。配置错误描述:处理服务此请求所需的配置文件期间发生错误。请查看下面的具体错误详细信息并适当地修改您的配置文件。

解析器错误消息:对象引用未设置为对象的实例。

源错误:

Line 50:                <clear/>
Line 51:                <!--<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="dq_systemConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/"/>-->
Line 52:         `<add name="CustomSqlMembershipProvider" type="AcmeCorp.CustomSqlMembershipProvider, AcmeCorp, Version=1.0.0.0, Culture=neutral" connectionStringName="AcmeCorpConnectionString" enablePasswordRetrieval="False" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="True" passwordFormat="Hashed" maxInvalidPasswordAttempts="6" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/" />`
Line 53:       </providers>
Line 54:        </membership>

这是 web.config 中成员资格对象的完整列表

<membership  defaultProvider="CustomSqlMembershipProvider">
        <providers>
            <clear />
            <!--<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="dq_systemConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/" />-->
<add name="CustomSqlMembershipProvider" type="AcmeCorp.CustomSqlMembershipProvider, AcmeCorp, Version=1.0.0.0, Culture=neutral" connectionStringName="dq_systemConnectionString" enablePasswordRetrieval="False" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="True" passwordFormat="Hashed" maxInvalidPasswordAttempts="6" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/" />

public class CustomSqlMembershipProvider : AcmeCorp.SqlMembershipProvider
  {
    static public ConnectionStringSettings css {get; set;}

    public override void Initialize(string name, NameValueCollection config)
    {
      config.Add("connectionString", css.ConnectionString);
      base.Initialize(name, config);
    }
  }

  public class CustomSqlRoleProvider : AcmeCorp.SqlRoleProvider
  {
    static public ConnectionStringSettings css { get; set; }


    public override string GetConnectionString()
    {
      return css.ConnectionString;
    }

    public override void Initialize(string name, NameValueCollection config)
    {
      //config.Add("connectionString", css.ConnectionString);
      base.Initialize(name, config);
    }
  }



  public interface ISiteProvider
  {
    bool Initialise(string host);
    Site GetCurrentSite();
  }

  public class SiteProvider : ISiteProvider
  {
    SystemMetaDataContext mDB;
    Site mSite;
    public SiteProvider(SystemMetaDataContext db)
    {
      mDB = db;
    }

    public bool Initialise(string host)
    {
      mSite = mDB.Sites.SingleOrDefault(s => s.Host == host);
      if (null != mSite)
      {
        CustomSqlMembershipProvider.css = new ConnectionStringSettings();
        CustomSqlMembershipProvider.css.ConnectionString = mSite.Connection;
        CustomSqlMembershipProvider.css.ProviderName = "System.Data.SqlClient";
        CustomSqlMembershipProvider.css.Name = "dq_systemConnectionString";
        CustomSqlMembershipProvider.css.ConnectionString = mSite.Connection;

        CustomSqlRoleProvider.css = new ConnectionStringSettings();
        CustomSqlRoleProvider.css.ConnectionString = mSite.Connection;
        CustomSqlRoleProvider.css.ProviderName = "System.Data.SqlClient";
        CustomSqlRoleProvider.css.Name = "dq_systemConnectionString";
        CustomSqlRoleProvider.css.ConnectionString = mSite.Connection;


        return true;
      }
      else
      {
        return false;
      }
    }

    public Site GetCurrentSite()
    {
      return mSite;
    }
  }  



 public class BaseController : Controller



 {
    ISiteProvider mSiteProvider;
    protected IRepository mRepository { get; private set; }
    protected int DefaultPageSize { get; set; }

    public BaseController()
    {
      DefaultPageSize = 10;
      mSiteProvider = new SiteProvider(new SystemMetaDataContext());  
    }

    public BaseController(IDQRepository repository)
    {
      mRepository = repository;
      DefaultPageSize = 10;
      if (Session["ActiveView"] == null)
      {
        IList<RoleViewModel> roles = mRepository.GetAllRoles();
        foreach (RoleViewModel rvm in roles)
        { 
          if (Roles.IsUserInRole(rvm.Name))
          {
            Session["ActiveView"] = rvm.Name;
            break;
          }
        }
      }
    }

     protected override void Initialize(RequestContext requestContext) 
     {
      string[] host = requestContext.HttpContext.Request.Headers["Host"].Split(':');
      MetaInfo.PopulateMeta(host[0]);
      if (!mSiteProvider.Initialise(host[0]))
        RedirectToRoute("Default");

      if (null == mRepository)
        mRepository = new DQRepository();

      base.Initialize(requestContext);  
     }  

     protected override void OnActionExecuting(ActionExecutingContext filterContext) 
     {
       ViewData["Site"] = Site;   
       base.OnActionExecuting(filterContext);  
     }  

     public Site Site {  
        get {  
            return mSiteProvider.GetCurrentSite();  
        }  
     }  
4

3 回答 3

0

检查您的自定义代码。最有可能的是,您正在尝试访问属性而不检查对象的可空性。这可能是由于在会员未找到相关人员时询问用户名或其他内容。向代码添加空引用检查至少可以消除错误,以便您可以引发适当的异常(然后给用户一个友好的错误消息)。

于 2011-10-10T16:33:16.403 回答
0

您对此提供程序的配置确实有许多冗余字段。如果您更改<add name="CustomSqlMembershipProvider" type="AcmeCorp.CustomSqlMembershipProvider, AcmeCorp, Version=1.0.0.0, Culture=neutral" ... /> 为会发生什么<add name="CustomSqlMembershipProvider" type="AcmeCorp.CustomSqlMembershipProvider"/>

于 2011-10-11T06:25:11.957 回答
0

这个静态变量在哪里初始化?

 static public ConnectionStringSettings css {get; set;}

静态变量不是线程安全的。您必须以线程安全的方式初始化它们,尤其是在网络农场模式下运行时。

如果服务器使用的应用程序池在其配置中设置了超过 1 个处理器,则它以 Web 农场模式运行。在网络农场模式下,您将运行 2 个网络应用程序,但您的静态变量将仅创建一次,因为此内存空间是共享的(实际上还有更多,但您可以写有关此主题的书籍)。

您可以通过在应用程序池中将处理器计数设置为 1 来禁用 Web 场模式。

初始化这个 css 变量的代码在哪里?可以在这里写吗?它是从哪里调用的?

于 2011-11-22T22:19:51.593 回答