2011-10-10 77 views
0

我已经部署到服务器的一个asp.net MVC应用程序,它使用窗体身份验证,并使用CustomSqlMembership提供商基本上我没有在SqlMembershipProvider的改变任何东西只是复制从MS源和包含在源我项目,并不时重新命名它出现这个错误。CustomSqlMembership抛出服务器错误间歇

这发生在本地主机和远程部署的系统上,我找不出可能的原因。

'/'应用程序中的服务器错误。 配置错误 描述:处理服务此请求所需的配置文件时发生错误。请查看下面的具体错误细节并适当修改您的配置文件。

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

源错误:

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(); 
     } 
    } 
+0

你说你基本上没有改变在供应商代码什么。为什么你需要自定义提供者呢?您遇到最有可能 错误源于不正确的引用,从您的自定义供应商实现类'Web.Config' –

+0

我想有动态连接字符串,不能做,没有一个自定义的成员提供。因为这是一个多租户SAAS应用程序,并且取决于主机名,我从其他数据库获取连接字符串并为此数据库设置连接字符串。 – AppDeveloper

+0

另外我在一个共享主机上运行,​​但这是一个有争议的问题,因为我已经看到这发生在我的localhost asp.net dev服务器上。 – AppDeveloper

回答

0

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

static public ConnectionStringSettings css {get; set;} 

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

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

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

初始化此css变量的代码在哪里? 你可以在这里写吗? 从哪里叫它?

+0

嗨,添加SiteProvider和BaseController所有控制器是由BaseController派生的基本控制器基本上是确定使用哪个连接字符串,该连接字符串来自一个单独的数据库,这是“元”,其连接字符串硬编码在网络的.config。我看到共享主机和开发服务器上的错误,因此不确定Web场模式是否与它有关。 – AppDeveloper

+0

这个配置错误也发生在我的本地开发服务器(Casini)上,所以我不认为它与服务器场有任何关系,但我不确定。 – AppDeveloper

+0

你有机会看看我的自定义代码吗? – AppDeveloper

0

检查您的自定义代码的完整列表。很可能,您正试图访问属性而不检查对象的可空性。这可能是因为当会员没有找到有问题的人时,要求提供用户名或其他内容。向代码添加一个空引用检查将至少消除错误,以便引发适当的异常(然后给用户一个友好的错误消息)。

+0

如果它是一个空指针异常,为什么它会显示我们配置错误无论如何跟踪这个? – AppDeveloper

+0

给你的堆栈跟踪,但我猜测提供者是在web.config文件被解析时由ASP.NET动态创建的。 “css”没有在那里初始化,所以它抛出这个异常。所以这就像是一个配置错误。 – Softlion

+0

@Softion没有堆栈跟踪(我如何得到一个?)它只显示为配置错误,如果“css”导致问题,那么为什么它只发生随机? – AppDeveloper

0

您为此提供商配置的确有很多冗余字段。如果将<add name="CustomSqlMembershipProvider" type="AcmeCorp.CustomSqlMembershipProvider, AcmeCorp, Version=1.0.0.0, Culture=neutral" ... /> 更改为<add name="CustomSqlMembershipProvider" type="AcmeCorp.CustomSqlMembershipProvider"/>,会发生什么情况?

+0

我可以肯定地尝试,但我不知道这是否能解决问题,因为问题是间歇性的,我不能总是重现它,所以任何修复都会等到下一次发生,除非我们知道什么是真正导致这个 – AppDeveloper

相关问题