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

时间:2015-07-27 17:08:37

标签: asp.net-mvc ninject ninject.web.mvc

我看过几个涉及这个问题的问题;但似乎没有一个匹配或修复我的情况。在我的开发机器上,我没有任何问题。当我部署(到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类未成功初始化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二进制文件)描述的备用设置,但这导致了相同的错误。所以现在我真的很困惑。

1 个答案:

答案 0 :(得分:0)

I still don't know what's going on, but somehow I've fixed this. Here's some information on my final configuration. Maybe this will help someone else. I'm sorry I can't be more help; but this just started working for me.

Final 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();
        }
    }
}

If someone else has a clue what I've done (if anything) that helped, answer and I'll give you the points for this question.