سؤال

لدي تطبيق MVC2 يعتمد على موقع بداية Tekpub, ، لذلك يستخدم Ninject لحقن التبعية ، NLOG للتسجيل ، ومجموعة من المكتبات الأخرى في أماكن مختلفة. بقدر ما أستطيع أن أقول ، هذه هي التي تسبب مشكلتي.

كل شيء يعمل بشكل جميل على جهاز الكمبيوتر الخاص بي باستخدام ASP.NET Dev Server (Cassini) ولكن عندما أقوم بنشر الخادم (إنها صفقة استضافة مشتركة رخيصة) ، أحصل على nullreferenceexception يبدو أنه مرتبط بتأسيس لوجبر.

إليك البتات ذات الصلة من global.asax.cs

protected override void OnApplicationStarted() {
    Logger.Info("App is starting"); // <-- I think this is what's causing the problem

    RegisterRoutes(RouteTable.Routes);
    //MvcContrib.Routing.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
    RegisterAllControllersIn(Assembly.GetExecutingAssembly());
    SetEngines();
}

protected override IKernel CreateKernel() {
    return Container;
}

internal class SiteModule : NinjectModule {
    public override void Load() {
        Bind<ILogger>().To<NLogLogger>();
        // and a couple of others...
    }
}

protected void Application_End() {
    Logger.Info("App is shutting down");
}

protected void Application_Error() {
    Exception lastException = Server.GetLastError();
    Logger.Fatal(lastException);
}

public ILogger Logger {
    get {
        return Container.Get<ILogger>();
        }
    }
    static IKernel _container;
    public static IKernel Container {
        get {
            if (_container == null) {
                _container = new StandardKernel(new SiteModule());
            }
            return _container;
        }
    }

و nlog.config

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >

    <targets>
        <!--Useful for debugging-->
        <target name="console" xsi:type="ColoredConsole"
         layout="${date:format=HH\:mm\:ss}|${level}|${stacktrace}|${message}" />

        <target name="file" xsi:type="File" fileName="${basedir}/App_Data/Site.log"
         layout="${date}: ${message}" />

        <target name="eventlog" xsi:type="EventLog" source="My App" log="Application"
        layout="${date}: ${message} ${stacktrace}" />

    </targets>

    <rules>
        <logger name="*" minlevel="Info" writeTo="file" />
        <!-- <logger name="*" minlevel="Fatal" writeTo="eventlog" /> -->
    </rules>
</nlog>

فئة nloglogger:

public class NLogLogger:ILogger {

    private Logger _logger;

    public NLogLogger() {
        _logger = LogManager.GetCurrentClassLogger();
    }

    public void Info(string message) {
        _logger.Info(message);
    }

    // similar for Warn, Debug, etc

تتبع المكدس:

[NullReferenceException: Object reference not set to an instance of an object.]
   NLog.LogManager.GetCurrentClassLogger() +84
   DynamicInjector8cdfc2eb02f8497596a4704e379a4bb4(Object[] ) +40
   Ninject.Activation.Providers.StandardProvider.Create(IContext context) +319
   Ninject.Activation.Context.Resolve() +182
   Ninject.KernelBase.<Resolve>b__4(IContext context) +8
   System.Linq.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) +32
   System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +151
   System.Linq.<CastIterator>d__b1`1.MoveNext() +92
   System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source) +4187840
   Ninject.ResolutionExtensions.Get(IResolutionRoot root, IParameter[] parameters) +149
   Web.Application.get_Logger() in C:\mvcstarter\Web\Global.asax.cs:159
   Web.Application.OnApplicationStarted() in C:\mvcstarter\Web\Global.asax.cs:80
   Ninject.Web.Mvc.NinjectHttpApplication.Application_Start() +535

[HttpException (0x80004005): Object reference not set to an instance of an object.]
   System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +9024793
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +131
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +194
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +339
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +253

[HttpException (0x80004005): Object reference not set to an instance of an object.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +8946484
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +97
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +256

إذا علقت على تسجيل الدخول OnApplicationStarted, ، أحصل على استثناء مختلف. لست متأكدًا من سبب حدوث ذلك ، لأنه لا ينبغي أن يحدث أي تسجيل ، لذا لست متأكدًا من سبب محاولته إنشاء إنشاء مسجل.

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

الطريقة الوحيدة التي يمكنني من خلالها جعل الموقع يعمل على الإطلاق هي التزوير عن المسجل تمامًا ، وهو ما لست سعيدًا به على الإطلاق. هذه هي المرة الأولى التي ألعب فيها باستخدام استضافة ASP.NET المشتركة ، لذلك أنا في حيرة. أي شخص لديه أي اقتراحات مفيدة؟

هل كانت مفيدة؟

المحلول

يمكنك تجنب استخدام LogManager.GetCurrentClassLogger() ودع Ninject حل اسم الفصل الحالي لك:

قم بتغيير مُنشئ فئة nloglogger الخاصة بك إلى هذا:

public NLogLogger(string currentClassName) 
{
  _logger = LogManager.GetLogger(currentClassName);
}

وتغيير ملزمة Ninject لحل اسم الفصل الحالي:

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

فائدة إضافية: يتضمن ملف السجل الخاص بك الآن أيضًا اسم الفصل حيث تم إصدار توجيه السجل.

أعلم أن إجابتي متأخرة قليلاً عن الحفلة ، لكنني كنت أعاني من هذا بنفسي اليوم ولم أتمكن من العثور على الإجابة في أي مكان. ربما هذا يساعد شخص آخر.

نصائح أخرى

يبدو أن nlog لا يمكن تشغيله في ثقة متوسطة:http://nlog-project.org/forum.html#nabble-td1685352

إذا نظرت إلى العالم ، فإن التطبيق يسجل عندما يبدأ الأمر وكذلك عند إيقاف تشغيله. يجب أن تكون قادرًا على إزالة ذلك وتكون سعيدًا.

غالبًا ما يكون للاستضافة المشتركة قيودًا على التفكير وما إلى ذلك.

لذلك أعتقد أن هذا

nullreferenceException: لم يتم تعيين مرجع الكائن على مثيل لكائن.] nlog.logmanager.getCurrentClassLogger () +84

يرتبط بذلك - ماذا يحدث إذا حصلت على المسجل باستخدام meachanism حيث تقوم باستعداد في أ Type التي تحصل عليها في وقت التجميع عبر typeof ?

لقد واجهت مشكلة مماثلة.

الحل الخاص بي (التبسيط):

استبدال هذه الخطوط

private Logger Logger = LogManager.GetCurrentClassLogger();

بواسطة هذا الخط

private static Logger Logger = LogManager.GetCurrentClassLogger();

ال readonly الكلمة الرئيسية اختيارية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top