私の Web サイトは、最初は VS2010 を使用して MVC 4.0 RC で作成されました。VS2012 をダウンロードしてインストールし、プロジェクトを Dotnet Framework 4.5 にアップグレードしました。
私のプロジェクトでは、Custom MemberShipProvider とカスタム RoleProvider を使用しています。VS2010では、それは魅力のように機能しました。しかし今、奇妙な設定エラーが発生し続けています:
「このメソッドは、アプリケーションの開始前の初期化段階では呼び出すことができません。」
web.config の「system.web -> members -> providers -> add」行は、問題の原因として赤くマークされています。
新しい MVC 4.0 プロジェクトを (VS2012 で) 作成し、カスタム メンバーシップ/ロール プロバイダーを追加し、web.config を適切に変更し、エラーが再発することを確認することで、問題が移行プロセスに関係しているという疑いを取り除きました!
問題をさらに掘り下げる - アプリケーション ログで次の情報を見つけました。
例外情報: 例外の種類: InvalidOperationException 例外メッセージ: WebMatrix.WebData.PreApplicationStartCode 型のアプリケーション開始前の初期化メソッド Start は、次のエラー メッセージで例外をスローしました: アプリケーションの開始前の初期化フェーズ中にこのメソッドを呼び出すことはできません。(C:\Users\dov.AD\Documents\Visual Studio 2012\Projects\MvcApplication2\MvcApplication2\web.config 行 52)。
System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore (ICollection) で1 methods, Func
1 setHostingEnvironmentCultures) の System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 メソッド) の System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath) の System.Web.Compilation.BuildManager.ExecutePreAppStart() の System.Web. Hosting.HostingEnvironment.Initialize(ApplicationManager appManager、IApplicationHost appHost、IConfigMapPathFactory configMapPathFactory、HostingEnvironmentParameters、hostingParameters、PolicyLevel policyLevel、例外 appDomainCreationException)このメソッドは、アプリケーションの開始前の初期化フェーズ中に呼び出すことはできません。(C:\Users\dov.AD\Documents\Visual Studio 2012\Projects\MvcApplication2\MvcApplication2\web.config 行 52)
System.Web.Configuration.ConfigUtil.GetType (文字列 typeName、文字列 propertyName、ConfigurationElement configElement、XmlNode ノード、ブール値 checkAptcaBit、ブール値 ignoreCase) で System.Web.Configuration.ConfigUtil.GetType (文字列 typeName、文字列 propertyName、ConfigurationElement configElement、ブール値) でcheckAptcaBit、Boolean ignoreCase) の System.Web.Configuration.ProvidersHelper.InstantiateProvider(ProviderSettings providerSettings、Type providerType) の System.Web.Configuration.ProvidersHelper.InstantiateProviders(ProviderSettingsCollection configProviders、ProviderCollection providers、Type providerType)
System.Web.Security.Membership.InitializeSettings (Boolean initializeGeneralSettings、RuntimeConfig appConfig、MembershipSection 設定) で System.Web.Security.Membership.Initialize() で System.Web.Security.Membership.get_Providers() で WebMatrix.WebData.WebSecurity WebMatrix.WebData.PreApplicationStartCode.Start() の .PreAppStartInit()このメソッドは、アプリケーションの開始前の初期化フェーズ中に呼び出すことはできません。System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()
で System.Web.Compilation.BuildManager.GetType (文字列 typeName、ブール値 throwOnError、ブール値 ignoreCase) で System.Web.Configuration.ConfigUtil.GetType (文字列 typeName、文字列 propertyName、ConfigurationElement) configElement、XmlNode ノード、ブール値の checkAptcaBit、ブール値の 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
メソッド、Func
1 setHostingEnvironmentCultures) at System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection
1 メソッド) の System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath) の System.Web.Compilation.BuildManager.ExecutePreAppStart() の System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory、HostingEnvironmentParameters、hostingParameters、PolicyLevel policyLevel、例外 appDomainCreationException)
助けてください、
ありがとうございました!
ここに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>
これは関連するカスタム メンバーシップです (単純化しましたが、問題はまだ残っています) コードで、ValidateUser だけが実際にオーバーライドされます。
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;
}
}
}
これは (簡略化された) RoleProvider です。
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;
}
}
}