在 MVC 5 中部署时没有无参数构造函数(使用 ninject.mvc5)

No parameterless constructor on deploy in MVC 5 (using ninject.mvc5)

我见过几个与此问题相关的问题;但是 none 似乎很符合或解决了我的情况。在我的开发机器上,我没有遇到任何问题。当我部署(到 IIS 8.5,Server 2012 R2)时,我开始遇到可怕的无参数构造函数错误。这是我正在使用的一些代码。

public class ReportController : BaseController
{
    public ReportController(KestrelContext ctx) : base(ctx) { }
}

我派生的基本控制器如下......

public class BaseController : Controller
{
    protected KestrelContext db;

    public BaseController(KestrelContext ctx)
    {
        db = ctx;
    }
}

和NinjectWebCommon.cs.....

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(KestrelAdmin.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(KestrelAdmin.App_Start.NinjectWebCommon), "Stop")]

namespace KestrelAdmin.App_Start
{
    using System;
    using System.Web;

    using Microsoft.Web.Infrastructure.DynamicModuleHelper;

    using Ninject;
    using Ninject.Web.Common;
    using KestrelAdmin.Models;

    public static class NinjectWebCommon 
    {
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();

        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
            bootstrapper.Initialize(CreateKernel);
        }

        /// <summary>
        /// Stops the application.
        /// </summary>
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }

        /// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            try
            {
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

                RegisterServices(kernel);
                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<KestrelContext>().ToSelf().InRequestScope();
        }        
    }
}

目标框架始终是 .NET 4.5 -- 不是 4.5.x,只是 4.5。在 packages.config 中验证依赖项。所有文件的权限似乎都是正确的。

非常感谢任何帮助。

更新:我在这里完全没有想法。据我所知,当我部署到 IIS 8.5 时,NinjectWebCommon class 未成功初始化 NinjectHttpModule。我将在这里包含我的包配置,希望有人能给我指明正确的方向。

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AsyncCTP" version="0.3" targetFramework="net45" />
  <package id="EntityFramework" version="6.1.3" targetFramework="net45" />
  <package id="jQuery" version="1.5.1" />
  <package id="jQuery.UI.Combined" version="1.8.11" />
  <package id="jQuery.Validation" version="1.8.0" />
  <package id="jQuery.vsdoc" version="1.5.1" />
  <package id="log4net" version="2.0.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebPages.Data" version="3.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebPages.WebData" version="3.2.3" targetFramework="net45" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
  <package id="Modernizr" version="1.7" />
  <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
  <package id="Ninject" version="3.2.0.0" targetFramework="net45" />
  <package id="Ninject.MVC5" version="3.2.1.0" targetFramework="net45" />
  <package id="Ninject.Web.Common" version="3.2.0.0" targetFramework="net45" />
  <package id="Ninject.Web.Common.WebHost" version="3.2.3.0" targetFramework="net45" />
  <package id="Ninject.Web.WebApi" version="3.2.4.0" targetFramework="net45" />
  <package id="Ninject.Web.WebApi.WebHost" version="3.2.4.0" targetFramework="net45" />
  <package id="WebActivatorEx" version="2.0.6" targetFramework="net45" />
  <package id="ZendeskApi_v2" version="3.0.20.0" targetFramework="net45" />
</packages>

此外,我尝试了 here 描述的替代设置(使用 github 二进制文件),但这导致了 same 错误。所以现在我真的很困惑。

我仍然不知道发生了什么,但我已经解决了这个问题。这是我的最终配置的一些信息。也许这会帮助别人。对不起,我不能提供更多帮助;但这才开始为我工作。

决赛packages.config。

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AsyncCTP" version="0.3" targetFramework="net45" />
  <package id="EntityFramework" version="6.1.3" targetFramework="net45" />
  <package id="jQuery" version="1.5.1" />
  <package id="jQuery.UI.Combined" version="1.8.11" />
  <package id="jQuery.Validation" version="1.8.0" />
  <package id="jQuery.vsdoc" version="1.5.1" />
  <package id="log4net" version="2.0.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.0.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebPages.Data" version="3.2.3" targetFramework="net45" />
  <package id="Microsoft.AspNet.WebPages.WebData" version="3.2.3" targetFramework="net45" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
  <package id="Modernizr" version="1.7" />
  <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
  <package id="Ninject" version="3.2.0.0" targetFramework="net45" />
  <package id="Ninject.MVC5" version="3.2.1.0" targetFramework="net45" />
  <package id="Ninject.Web.Common" version="3.2.0.0" targetFramework="net45" />
  <package id="Ninject.Web.Common.WebHost" version="3.2.3.0" targetFramework="net45" />
  <package id="Ninject.Web.WebApi" version="3.2.4.0" targetFramework="net45" />
  <package id="Ninject.Web.WebApi.WebHost" version="3.2.4.0" targetFramework="net45" />
  <package id="WebActivatorEx" version="2.0.6" targetFramework="net45" />
  <package id="ZendeskApi_v2" version="3.0.20.0" targetFramework="net45" />
</packages>

NinjectWebCommon.cs

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(KestrelAdmin.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(KestrelAdmin.App_Start.NinjectWebCommon), "Stop")]

namespace KestrelAdmin.App_Start
{
    using System;
    using System.Web;

    using Microsoft.Web.Infrastructure.DynamicModuleHelper;

    using Ninject;
    using Ninject.Web.Common;
    using KestrelAdmin.Models;
    using Ninject.Web.Mvc;

    public static class NinjectWebCommon 
    {
        public static readonly Bootstrapper bootstrapper = new Bootstrapper();

        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
            bootstrapper.Initialize(CreateKernel);
        }

        /// <summary>
        /// Stops the application.
        /// </summary>
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }

        /// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            try
            {
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

                RegisterServices(kernel);
                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<KestrelContext>().ToSelf().InRequestScope();
        }        
    }
}

Global.asax.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using log4net.Config;
using log4net;
using KestrelAdmin.Controllers;
using KestrelAdmin.App_Start;

namespace KestrelAdmin
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(MvcApplication));

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
                new { controller = @"[^\.]*" }                          // Parameter constraints
            );
        }

        protected void Application_Error()
        {
            var exception = Server.GetLastError();
            var httpException = exception as HttpException;
            Response.Clear();
            Server.ClearError();
            var routeData = new RouteData();
            routeData.Values["controller"] = "Errors";
            routeData.Values["action"] = "Error404";
            routeData.Values["exception"] = exception;
            Response.StatusCode = 500;
            if (httpException != null)
            {
                Response.StatusCode = httpException.GetHttpCode();
                switch (Response.StatusCode)
                {
                    case 403:
                        routeData.Values["action"] = "Error404";
                        break;
                    case 404:
                        routeData.Values["action"] = "Error404";
                        break;
                    case 500:
                        routeData.Values["action"] = "Error404";
                        break;
                }
            }
            log.Fatal("Error " + Response.StatusCode + ": " + exception.Message + " \r\n Occurred on: " + Request.Url + Request.QueryString + " \r\nFrom:" + Request.UserHostAddress + ":" + Request.UserHostName + "\r\n Stack Trace: " + exception.StackTrace);

            IController errorsController = new ErrorController();
            var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
            errorsController.Execute(rc);
        }

        protected void Application_Start()
        {
           // ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory(NinjectWebCommon.bootstrapper.Kernel));
            AreaRegistration.RegisterAllAreas();

            log4net.Config.XmlConfigurator.Configure();
            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
            XmlConfigurator.Configure();
        }
    }
}

如果其他人知道我所做的事情(如果有的话)有帮助,请回答,我会给你这个问题的分数。