asp.net-mvc-2 – ASP.NET MVC2 Ninject NLog(shared hosting?)= NullReferenceException

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-2 – ASP.NET MVC2 Ninject NLog(shared hosting?)= NullReferenceException前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个基于 Tekpub Starter Site的MVC2应用程序,所以它使用Ninject进行依赖注入,NLog用于日志记录,还有一些其他库在各个地方.据我所知,这正是我的问题.

一切都在使用ASP.NET开发服务器(Cassini)的PC上精美地工作,但是当我部署到服务器(这是一个便宜的共享主机协议))时,我得到一个NullReferenceException,它似乎与实例化记录器的Ninject有关.

这是我的Global.asax.cs的相关位

  1. protected override void OnApplicationStarted() {
  2. Logger.Info("App is starting"); // <-- I think this is what's causing the problem
  3.  
  4. RegisterRoutes(RouteTable.Routes);
  5. //MvcContrib.Routing.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
  6. RegisterAllControllersIn(Assembly.GetExecutingAssembly());
  7. SetEngines();
  8. }
  9.  
  10. protected override IKernel CreateKernel() {
  11. return Container;
  12. }
  13.  
  14. internal class SiteModule : NinjectModule {
  15. public override void Load() {
  16. Bind<ILogger>().To<NLogLogger>();
  17. // and a couple of others...
  18. }
  19. }
  20.  
  21. protected void Application_End() {
  22. Logger.Info("App is shutting down");
  23. }
  24.  
  25. protected void Application_Error() {
  26. Exception lastException = Server.GetLastError();
  27. Logger.Fatal(lastException);
  28. }
  29.  
  30. public ILogger Logger {
  31. get {
  32. return Container.Get<ILogger>();
  33. }
  34. }
  35. static IKernel _container;
  36. public static IKernel Container {
  37. get {
  38. if (_container == null) {
  39. _container = new StandardKernel(new SiteModule());
  40. }
  41. return _container;
  42. }
  43. }

nlog.config

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  3.  
  4. <targets>
  5. <!--Useful for debugging-->
  6. <target name="console" xsi:type="ColoredConsole"
  7. layout="${date:format=HH\:mm\:ss}|${level}|${stacktrace}|${message}" />
  8.  
  9. <target name="file" xsi:type="File" fileName="${basedir}/App_Data/Site.log"
  10. layout="${date}: ${message}" />
  11.  
  12. <target name="eventlog" xsi:type="EventLog" source="My App" log="Application"
  13. layout="${date}: ${message} ${stacktrace}" />
  14.  
  15. </targets>
  16.  
  17. <rules>
  18. <logger name="*" minlevel="Info" writeTo="file" />
  19. <!-- <logger name="*" minlevel="Fatal" writeTo="eventlog" /> -->
  20. </rules>
  21. </nlog>

NLogLogger类:

  1. public class NLogLogger:ILogger {
  2.  
  3. private Logger _logger;
  4.  
  5. public NLogLogger() {
  6. _logger = LogManager.GetCurrentClassLogger();
  7. }
  8.  
  9. public void Info(string message) {
  10. _logger.Info(message);
  11. }
  12.  
  13. // similar for Warn,Debug,etc

堆栈跟踪:

  1. [NullReferenceException: Object reference not set to an instance of an object.]
  2. NLog.LogManager.GetCurrentClassLogger() +84
  3. DynamicInjector8cdfc2eb02f8497596a4704e379a4bb4(Object[] ) +40
  4. Ninject.Activation.Providers.StandardProvider.Create(IContext context) +319
  5. Ninject.Activation.Context.Resolve() +182
  6. Ninject.KernelBase.<Resolve>b__4(IContext context) +8
  7. System.Linq.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) +32
  8. System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +151
  9. System.Linq.<CastIterator>d__b1`1.MoveNext() +92
  10. System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source) +4187840
  11. Ninject.ResolutionExtensions.Get(IResolutionRoot root,IParameter[] parameters) +149
  12. Web.Application.get_Logger() in C:\mvcstarter\Web\Global.asax.cs:159
  13. Web.Application.OnApplicationStarted() in C:\mvcstarter\Web\Global.asax.cs:80
  14. Ninject.Web.Mvc.NinjectHttpApplication.Application_Start() +535
  15.  
  16. [HttpException (0x80004005): Object reference not set to an instance of an object.]
  17. System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context,HttpApplication app) +9024793
  18. System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext,HttpContext context,MethodInfo[] handlers) +131
  19. System.Web.HttpApplication.InitSpecial(HttpApplicationState state,MethodInfo[] handlers,IntPtr appContext,HttpContext context) +194
  20. System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext,HttpContext context) +339
  21. System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +253
  22.  
  23. [HttpException (0x80004005): Object reference not set to an instance of an object.]
  24. System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +8946484
  25. System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +97
  26. System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr,HttpContext context) +256

如果我注释了OnApplicationStarted的日志记录,我会得到一个不同的异常.我不知道为什么会发生这种情况,因为不应该发生任何日志记录,所以我不知道为什么尝试实例化记录器.

  1. [NullReferenceException: Object reference not set to an instance of an object.]
  2. NLog.LogManager.GetCurrentClassLogger() +84
  3. DynamicInjector5ca7d21cf56b4732957e22cb1bfd8bdd(Object[] ) +40
  4. Ninject.Activation.Providers.StandardProvider.Create(IContext context) +319
  5. Ninject.Activation.Context.Resolve() +182
  6. Ninject.KernelBase.<Resolve>b__4(IContext context) +8
  7. System.Linq.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) +32
  8. System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +151
  9. System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source) +4187840
  10. Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) +347
  11. Ninject.Activation.Providers.StandardProvider.GetValue(IContext context,ITarget target) +138
  12. Ninject.Activation.Providers.<>c__DisplayClass2.<Create>b__1(ITarget target) +17
  13. System.Linq.WhereSelectArrayIterator`2.MoveNext() +85
  14. System.Linq.Buffer`1..ctor(IEnumerable`1 source) +325
  15. System.Linq.Enumerable.ToArray(IEnumerable`1 source) +78
  16. Ninject.Activation.Providers.StandardProvider.Create(IContext context) +306
  17. Ninject.Activation.Context.Resolve() +182
  18. Ninject.KernelBase.<Resolve>b__4(IContext context) +8
  19. System.Linq.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) +32
  20. System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +151
  21. System.Linq.<CastIterator>d__b1`1.MoveNext() +92
  22. System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source) +4187840
  23. Ninject.ResolutionExtensions.TryGet(IResolutionRoot root,String name,IParameter[] parameters) +261
  24. Ninject.Web.Mvc.NinjectControllerFactory.CreateController(RequestContext requestContext,String controllerName) +108
  25. System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext,IController& controller,IControllerFactory& factory) +124
  26. System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback callback,Object state) +50
  27. System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext,Object state) +48
  28. System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context,AsyncCallback cb,Object extraData) +16
  29. System.Web.Mvc.<>c__DisplayClass7.<BeginProcessRequest>b__6() +29
  30. System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap(Func`1 func) +38
  31. System.Web.Mvc.ServerExecuteHttpHandlerAsyncWrapper.BeginProcessRequest(HttpContext context,Object extraData) +97
  32. System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler,TextWriter writer,Boolean preserveForm,Boolean setPrevIoUsPage,VirtualPath path,VirtualPath filePath,String physPath,Exception error,String queryStringOverride) +1508
  33. System.Web.HttpServerUtility.Execute(IHttpHandler handler,Boolean setPrevIoUsPage) +77
  34. System.Web.HttpServerUtility.Execute(IHttpHandler handler,Boolean preserveForm) +28
  35. System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler,Boolean preserveForm) +22
  36. System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper,String actionName,String controllerName,RouteValueDictionary routeValues,TextWriter textWriter) +372
  37. System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper htmlHelper,String controllerName) +35
  38. ASP.views_home_index_aspx.__RenderContent2(HtmlTextWriter __w,Control parameterContainer) in c:\HostingSpaces\<snip>\wwwroot\Views\Home\Index.aspx:8
  39. System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children) +109
  40. System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
  41. System.Web.UI.Control.Render(HtmlTextWriter writer) +10
  42. System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer,ControlAdapter adapter) +27
  43. System.Web.UI.Control.RenderControl(HtmlTextWriter writer,ControlAdapter adapter) +100
  44. System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
  45. ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w,Control parameterContainer) in c:\HostingSpaces\<snip>\wwwroot\Views\Shared\Site.Master:48
  46. System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ControlAdapter adapter) +100
  47. System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
  48. System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer,ICollection children) +208
  49. System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
  50. System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +55
  51. System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer,ControlAdapter adapter) +100
  52. System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
  53. System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint) +3060

我唯一可以让网站工作的方法是完全伪造记录器,我完全不开心.这是我第一次使用ASP.NET共享托管,所以我有点失落.任何人都有任何有用的建议?

解决方法

您可以避免使用LogManager.GetCurrentClassLogger()并让Ninject为您解决当前的类名:

将NLogLogger类的构造函数更改为:

  1. public NLogLogger(string currentClassName)
  2. {
  3. _logger = LogManager.GetLogger(currentClassName);
  4. }

并更改ninject绑定以解析当前的类名称

  1. Bind<ILogger>().To<NLogLogger>()
  2. .WithConstructorArgument("currentClassName",x => x.Request.ParentContext.Request.Service.FullName);

额外的好处:您的日志文件现在还包括发出日志指令的类名.

我知道我的答案有点晚了,但我今天很自豪,在任何地方找不到答案.也许这有助于别人.

猜你在找的asp.Net相关文章