0

フォーム認証を使用し、CustomSqlMembershipプロバイダーを使用するサーバーにasp.net MVCアプリをデプロイしました。基本的に、SqlMembershipPRoviderで何も変更していません。ソースを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

この静的変数はどこで初期化されますか?

 static public ConnectionStringSettings css {get; set;}

静的変数はスレッドセーフではありません。特にWebファームモードで実行している場合は、スレッドセーフな方法でそれらを初期化する必要があります。

サーバーが、構成に複数のプロセッサーが設定されているアプリケーションプールを使用している場合、サーバーはWebファームモードで実行されています。Webファームモードでは、2つのWebアプリケーションが実行されますが、このメモリスペースが共有されるため、静的変数は1回だけ作成されます(実際にはそれ以上ありますが、このテーマに関する本を書くことができます)。

アプリケーションプールでプロセッサ数を1に設定すると、Webファームモードを無効にできます。

このcss変数を初期化するコードはどこにありますか?ここに書いて頂けますか?それはどこから呼ばれていますか?

于 2011-11-22T22:19:51.593 に答える
0

カスタムコードを確認してください。ほとんどの場合、オブジェクトの null 可能性を確認せずにプロパティにアクセスしようとしています。これはおそらく、メンバーシップが問題の人を見つけられなかったときに、ユーザー名か何かを尋ねたことが原因です。コードに null 参照チェックを追加すると、少なくともエラーが解消されるため、適切な例外を発生させることができます (そして、ユーザーに分かりやすいエラー メッセージを表示できます)。

于 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 に答える