部署应用程序时,asp.net mvc应用程序抛出控制器异常

时间:2014-10-29 09:53:41

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我有一个使用.net 4.5.1的MVC 4 Web应用程序,它在本地运行良好但是当我将站点部署到实时服务器时,它会在我调用控制器时抛出异常。只有在抛出异常时抛出异常我在控制器上放了一个构造函数。我通过从控制器中删除构造函数来测试应用程序它会正常工作。我无法弄清楚为什么会发生这种情况。

这是我的控制器:

namespace Test.Controllers
{
  public class TestController : Controller
  {
     private readonly ICountryService _countryService;

     public TestController()
     {
         _countryService=new CountryService();
     }

     // GET: /Test/
     public ActionResult Index()
     {

          var items = _countryService.GetAllCountries();
        return View(items.ToList());
     }
  }
}

以下是例外:

  

异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

来源错误:

  

执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

     

堆栈追踪:

     

[NullReferenceException:对象引用未设置为的实例   object。] Test.Controllers.TestController..ctor()+74

     

[TargetInvocationException:目标抛出了异常   调用。] System.RuntimeTypeHandle.CreateInstance(RuntimeType   type,Boolean publicOnly,Boolean noCheck,Boolean& canBeCached,   RuntimeMethodHandleInternal&安培; ctor,布尔& bNeedSecurityCheck)+0   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean   skipCheckThis,Boolean fillCache,StackCrawlMark& stackMark)+113   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly,   Boolean skipCheckThis,Boolean fillCache,StackCrawlMark& stackMark)   +232 System.Activator.CreateInstance(Type type,Boolean nonPublic)+83 System.Activator.CreateInstance(Type type)+6   System.Web.Mvc.DefaultControllerActivator.Create(的RequestContext   requestContext,Type controllerType)+55

     

[InvalidOperationException:尝试创建时出错   'Test.Controllers.TestController'类型的控制器。确保这一点   控制器有一个无参数的公共构造函数。]   System.Web.Mvc.DefaultControllerActivator.Create(的RequestContext   requestContext,Type controllerType)+178   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(的RequestContext   requestContext,Type controllerType)+77   System.Web.Mvc.DefaultControllerFactory.CreateController(的RequestContext   requestContext,String controllerName)+66   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase   httpContext,IController&控制器,IControllerFactory&厂)   +191 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback回调,对象状态)+50   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext,   AsyncCallback回调,对象状态)+48   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext的   context,AsyncCallback cb,Object extraData)+16   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   +301 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)+155

为什么在将网站部署到实时服务器时会发生这种情况。

感谢您提供的任何帮助。如果您需要任何其他信息来帮助回答此问题,请与我们联系

2 个答案:

答案 0 :(得分:1)

你的构造函数中是NullReferenceException。这意味着您正在尝试访问尚未实例化的对象。您正在访问的唯一对象是Response对象,因此这里的逻辑结论是,当您的控制器被实例化时,控制器中的Response成员为空。这是因为在调用Controller.Request方法之前,不会填充与上下文相关的数据(Controller.ResponseInitialize等)。

我的问题是,为什么要直接写入ASP.NET MVC中的Response?这听起来像是从ASP.NET WebForms中获取的坏习惯。

以下是使用Ninject进行依赖注入的方法:

NinjectWebCommon.cs:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<ICountryService>().To<CountryService>();
    // other bindings....
    //...
}

TestController.cs

public class TestController : Controller
{
    private readonly ICountryService _countryService;

    public TestController(ICountryService countryService)
    {
        _countryService = countryService;
    }

    // GET: /Test/
    public ActionResult Index()
    {
        var items = _countryService.GetAllCountries();
        return View(items.ToList());
    }

}

答案 1 :(得分:0)

这是因为您的Response对象是null。您还可以注意到在浏览器中(发生异常的地方)就在堆栈跟踪的正上方。

修改:&amp;顺便说一下,如果您注意到,您的HttpContext对象也将是null

相反,您可以尝试:

 var res = System.Web.HttpContext.Current.Response;
 res.Write("hi");

这有效;)