asp.net 4.5 configuração do provedor de associação personalizado lança exceção estranha [duplicado]

Esta questão já tem uma resposta aqui:

ASP.NET: Este método não pode ser chamado durante o estágio de inicialização de pré-inicialização do aplicativo 5 respostas

Meu site foi inicialmente escrito em MVC 4.0 RC usando VS2010,. Acabei de baixar e instalar o VS2012 e atualizei meu projeto para o Dotnet Framework 4.5.

No meu projeto, estou usando um Custom MemberShipProvider e um RoleProvider personalizado. No VS2010 funcionou como um encanto. Mas agora estou recebendo um erro de configuração estranho:

"Este método não pode ser chamado durante a fase de inicialização de pré-inicialização do aplicativo."

A linha "system.web -> membership -> providers -> add" no meu web.config é marcada em vermelho como a origem do problema.

Eu eliminei a suspeita de que o problema tem algo a ver com o processo de migração, criando um novo MVC 4.0 Project (no VS2012), adicionando meus provedores de Associação / Função, alterando o web.config apropriadamente e descobrindo que o erro reaparece!

Indo mais fundo no problema - achei as seguintes informações no log do aplicativo:

Informações de exceção: Tipo de exceção: InvalidOperationException Mensagem de exceção: O método de inicialização de início de pré-aplicativo Inicie no tipo WebMatrix.WebData.PreApplicationStartCode emitiu uma exceção com a seguinte mensagem de erro: Este método não pode ser chamado durante a fase de inicialização de pré-inicialização do aplicativo. (C: \ Users \ dov.AD \ Documents \ Visual Studio 2012 \ Projects \ MvcApplication2 \ MvcApplication2 \ web.config linha 52).
em System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore (ICollection1 methods, Func1 setHostingEnvironmentCultures) em System.Web.Compilation.BuildManager.InvokePreStartInitMethods (ICollection`1 methods) em System.Web.Compilation.BuildManager.CallPreStartInitMethods (String preStartInitListPath) em System.Web.Compilation.BuildManager.ExecutePreAppStart () em System.Web. Hosting.HostingEnvironment.Initialize (ApplicationManager appManager, IApplicationHost, appHost, IConfigMapPathFactory, configMapPathFactory, HostingEnvironmentParameters, hostingParameters, PolicyLevel, policyLevel, Exception, appDomainCreationException)

Esse método não pode ser chamado durante a fase de inicialização de pré-inicialização do aplicativo. (C: \ Usuários \ dov.AD \ Documents \ Visual Studio 2012 \ Projetos \ MvcApplication2 \ MvcApplication2 \ web.config linha 52)
em System.Web.Configuration.ConfigUtil.GetType (Cadeia typeName, Cadeia propertyName, ConfigurationElement configElement, XmlNode nó, Boolean checkAptcaBit, Boolean ignoreCase) em System.Web.Configuration.ConfigUtil.GetType (Cadeia typeName, Cadeia propertyName, ConfigurationElement configElement, Boolean checkAptcaBit, Boolean ignoreCase) em System.Web.Configuration.ProvidersHelper.InstantiateProvider (ProviderSettings providerSettings, tipo providerType) em System.Web.Configuration.ProvidersHelper.InstantiateProviders (ProviderSettingsCollection configProviders, ProviderCollection providers, tipo providerType)
em System.Web.Security.Membership.InitializeSettings (configurações booleanas initializeGeneralSettings, RuntimeConfig appConfig, MembershipSection) em System.Web.Security.Membership.Initialize () em System.Web.Security.Membership.get_Providers () em WebMatrix.WebData.WebSecurity .PreAppStartInit () em WebMatrix.WebData.PreApplicationStartCode.Start ()

Esse método não pode ser chamado durante a fase de inicialização de pré-inicialização do aplicativo. em System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled ()
em System.Web.Compilation.BuildManager.GetType (String typeName, Boolean throwOnError, Boolean ignoreCase) em System.Web.Configuration.ConfigUtil.GetType (String typeName, Cadeia propertyName, ConfigurationElement configElement, nó XmlNode, Boolean checkAptcaBit, Boolean ignoreCase)

Request information: 
Request URL: http://localhost:4995/ 
Request path: / 
User host address: ::1 
User:  
Is authenticated: False 
Authentication Type:  
Thread account name: AD\dov    Thread information: 
Thread ID: 5 
Thread account name: AD\dov 
Is impersonating: False 
Stack trace:    at >System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection`1

métodos, Func1 setHostingEnvironmentCultures) at System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection1 métodos) em System.Web.Compilation.BuildManager.CallPreStartInitMethods (String preStartInitListPath) em System.Web.Compilation.BuildManager.ExecutePreAppStart () em System.Web.Hosting.HostingEnvironment.Initialize (ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)

Por favor ajude,

Obrigado!

Aqui está o web.config:

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-MyWebSite-20120820105950;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-MyWebSite-20120820105950.mdf" providerName="System.Data.SqlClient" />
    <add name="MyWebSiteDbContext" providerName="System.Data.SqlClient" connectionString="server=.;database=MyWebSiteDB;Integrated Security=True;" />
  </connectionStrings>
  <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
    <profile>
      <providers>
        <clear/>
      </providers>
    </profile>
    <roleManager defaultProvider="MyWebSiteRoleProvider" enabled="true">
      <providers>
        <clear/>     
        <add name="MyWebSiteRoleProvider" type="MyWebSite.Security.MyWebSiteRoleProvider"/>
      </providers>
    </roleManager>
    <membership defaultProvider="MyWebSiteMembershipProvider">
      <providers>
        <clear />
        <add name="MyWebSiteMembershipProvider" type="MyWebSite.Security.MyWebSiteMembershipProvider"  />
      </providers>
    </membership>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

Esta é a associação personalizada relevante (simplifiquei isso, mas mesmo que o problema ainda esteja lá) código, apenas ValidateUser é realmente substituído:

using System;
using System.Linq;
using System.Web.Security;
using DAL.MyWebSite;

namespace MyWebSite.Security
{
    public class MyWebSiteMembershipProvider : MembershipProvider
    {




        /// <summary>
        /// Verifies that the specified user name and password exist in the data source.
        /// </summary>
        /// <returns>
        /// true if the specified username and password are valid; otherwise, false.
        /// </returns>
        /// <param name="username">The name of the user to validate. </param><param name="password">The password for the specified user. </param>
        public override bool ValidateUser(string username, string password)
        {
            // simplified
            return true;
        }



    }
}

Este é o RoleProvider (simplificado):

using System;
using System.Linq;
using System.Web.Security;
using DAL.MyWebSite;

namespace MyWebSite.Security
{
    public class MyWebSiteRoleProvider : RoleProvider
    {


        //readonly MyWebSiteDbContext _context = new MyWebSiteDbContext();
        /// <summary>
        /// Gets a value indicating whether the specified user is in the specified role for the configured applicationName.
        /// </summary>
        /// <returns>
        /// true if the specified user is in the specified role for the configured applicationName; otherwise, false.
        /// </returns>
        /// <param name="username">The user name to search for.</param><param name="roleName">The role to search in.</param>
        public override bool IsUserInRole(string username, string roleName)
        {
            return true;
            //return GetRolesForUser(username).Contains(roleName);
        }

        /// <summary>
        /// Gets a list of the roles that a specified user is in for the configured applicationName.
        /// </summary>
        /// <returns>
        /// A string array containing the names of all the roles that the specified user is in for the configured applicationName.
        /// </returns>
        /// <param name="username">The user to return a list of roles for.</param>
        public override string[] GetRolesForUser(string username)
        {
            return new string[] {"one", "two"};

            //var sm = _context.SalesManagers.Include("PermissionLevel").FirstOrDefault(manager => manager.UserName == username);

            //if (sm != null)
            //{
            //    if (sm.PermissionLevel.Name == "Sales Manager")
            //    {
            //        return new[] { "SalesManagers" };
            //    }

            //    if (sm.PermissionLevel.Name == "Administrator")
            //    {
            //        return new[] { "SalesManagers", "Administrators" };
            //    }

            //} 
            //return null;

        }

    }
}

questionAnswers(4)

yourAnswerToTheQuestion