2011-10-10 97 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

相關問題