我有一个使用.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
为什么在将网站部署到实时服务器时会发生这种情况。
感谢您提供的任何帮助。如果您需要任何其他信息来帮助回答此问题,请与我们联系
答案 0 :(得分:1)
你的构造函数中是NullReferenceException
。这意味着您正在尝试访问尚未实例化的对象。您正在访问的唯一对象是Response
对象,因此这里的逻辑结论是,当您的控制器被实例化时,控制器中的Response
成员为空。这是因为在调用Controller.Request
方法之前,不会填充与上下文相关的数据(Controller.Response
,Initialize
等)。
我的问题是,为什么要直接写入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");
这有效;)