5

1 台のコンピューター (VS 2012) ではうまく動作するが、もう 1 台のコンピューター (VS 2010) ではうまく動作しない MVC4 プロジェクトに問題があります。

(競合する VS バージョンが問題ではないことを願っていますが、プロジェクトはもともと VS2010 コンピューターからのものでした。2012 年にいくつかの作業を行い、現在は 2010 に戻そうとしています。)

「コントローラーにパラメーターのないパブリック コンストラクターがあることを確認してください」というエラーが表示されますが、私のコントローラーには既定のコンストラクターがあると思います。

public class HomeController : AuthorizedControllerBase
{
    public ViewResult Index()
    {
        return View();
    }
}

エラーをスローするコードは、私の ControllerFactory にあります。

public class ControllerFactory : DefaultControllerFactory
{
    private readonly IStateProvider _sessionStateProvider;

    public ControllerFactory(IStateProvider aStateProvider)
    {
        _sessionStateProvider = aStateProvider;
    }

    public override IController CreateController
    (System.Web.Routing.RequestContext requestContext, string controllerName)
    {
        IController controller = base.CreateController(requestContext, controllerName);
        if (controller is BaseController)
        {
            var baseController = (BaseController)controller; // ***This line***
            baseController.SessionData = _sessionStateProvider;
        }
        return controller;
    }
}

インターフェイスの実装者にパブリック コンストラクターがない、これに似た質問を見ましたが、やはり、私のものにはデフォルトのコンストラクターがあると思います。

public class SessionStateProvider : IStateProvider
{
    public object this[string key]
    {
        get
        {
            return HttpContext.Current.Session[key];
        }
        set
        {
            HttpContext.Current.Session[key] = value;
        }
    }

    public void Remove(string key)
    {
        HttpContext.Current.Session.Remove(key);
    }
}

他の質問への回答とスタック トレースに基づいて、Autofac の問題を調査しています。Install-Package Autofacプロジェクトに最新(3.0.2)を入れたばかりで、スタックトレースは次のようになります。

InnerException: Autofac.Core.DependencyResolutionException
   Message=An exception was thrown while executing a resolve operation. See the InnerException for details. ---> Common Language Runtime detected an invalid program. (See inner exception for details.)
   Source=Autofac
   StackTrace:
        at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)
        at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
        at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
        at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters)
        at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType, IEnumerable`1 parameters)
        at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType)
        at Autofac.Integration.Mvc.AutofacDependencyResolver.GetService(Type serviceType)
        at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType)
   InnerException: System.InvalidProgramException
        Message=Common Language Runtime detected an invalid program.
        Source=Autofac
        StackTrace:
             at Autofac.Core.Activators.Reflection.ConstructorParameterBinding..ctor(ConstructorInfo ci, IEnumerable`1 availableParameters, IComponentContext context)
             at Autofac.Core.Activators.Reflection.ReflectionActivator.<>c__DisplayClass5.<GetConstructorBindings>b__4(ConstructorInfo ci)
             at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
             at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
             at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
             at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
             at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
             at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)
             at Autofac.Core.Resolving.InstanceLookup.Execute()
             at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
             at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
             at Autofac.Core.Registration.ExternalRegistrySource.<>c__DisplayClass8.<RegistrationsFor>b__3(IComponentContext c, IEnumerable`1 p)
             at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
             at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)
             at Autofac.Core.Resolving.InstanceLookup.Execute()
             at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
             at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
             at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)

これは、実際に IStateProvider を次のように登録しているにもかかわらず発生builder.Register(context => new SessionStateProvider()).As<IStateProvider>();ContainerBuilder.BuildContainer()ます。Global.asax では、ControllerFactory も登録します。

protected void Application_Start()
{
    Container = ContainerBuilder.BuildContainer();
    var autofacDependencyResolver = new AutofacDependencyResolver(Container);
    DependencyResolver.SetResolver(autofacDependencyResolver);
    ControllerBuilder.Current.SetControllerFactory(new ControllerFactory(Container.Resolve<IStateProvider>()));
    Application_Start_MVC();
}

これを解決するための次の可能な手順がわかりません (Autofac スタックトレースを解析する深さからはほど遠いです)。助けていただければ幸いです。

4

1 に答える 1