2011-11-03 39 views
5

EDIT: Như Kirk Woll đã chỉ ra chính xác, vấn đề là NLog, không phải với NInject. Vì vậy, hãy để tôi nói lại vấn đề này:NLog Không ở Chế độ Phát hành trong IIS7

EDIT2: Bây giờ tôi biết đó là NLog + một vấn đề IoC, tôi thấy giải pháp tại ASP.NET MVC2 + Ninject + NLog (+ shared hosting?) = NullReferenceException

tôi có một dự án đang sử dụng Ninject để tiêm một lớp NLogger qua Giao diện ILogger vào tất cả các bộ điều khiển của tôi. Steven, để trả lời câu hỏi của bạn để giữ cho web.config của tôi được sạch sẽ, tôi đã sử dụng một tệp NLog.Config để tách riêng cấu hình đó.

Khi tôi nhắm mục tiêu IIS7 trong chế độ gỡ lỗi, mã hoạt động chính xác, nhưng trong chế độ phát hành tôi nhận được dấu vết ngăn xếp dưới đây.

Nếu bất kỳ ai có bất kỳ ý tưởng nào về lý do tại sao Chế độ gỡ lỗi mã sẽ hoạt động và tại sao trong bản phát hành, mã sẽ không được đánh giá cao. Tôi cũng đã bao gồm NLog Config File của tôi dưới đây.

<?xml version="1.0"?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <targets> 
    <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//Logs/site.log" 
      layout="${date}: ${message}" /> 
    <target name="eventlog" xsi:type="EventLog" 
      source="Template" 
      log="Application" 
      layout="${date}: ${message} ${stacktrace}" /> 
    </targets> 
    <rules> 
    <logger name="*" minlevel="Info" writeTo="file" /> 
    <logger name="*" minlevel="Fatal" writeTo="eventlog" />   
    </rules> 
</nlog> 

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.] 
    NLog.LogManager.GetCurrentClassLogger() +84 
    DynamicInjectorc5f536e7a4564738b2e779e62f9c20c7(Object[]) +40 
    Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:81 
    Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Context.cs:157 
    Ninject.KernelBase.<Resolve>b__7(IContext context) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\KernelBase.cs:375 
    System.Linq.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) +32 
    System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +151 
    System.Linq.Enumerable.SingleOrDefault(IEnumerable`1 source) +4222965 
    Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Planning\Targets\Target.cs:179 
    Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Planning\Targets\Target.cs:147 
    Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:97 
    Ninject.Activation.Providers.<>c__DisplayClass2.<Create>b__1(ITarget target) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:81 
    System.Linq.WhereSelectArrayIterator`2.MoveNext() +85 
    System.Linq.Buffer`1..ctor(IEnumerable`1 source) +217 
    System.Linq.Enumerable.ToArray(IEnumerable`1 source) +78 
    Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:81 
    Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\Activation\Context.cs:157 
    Ninject.KernelBase.<Resolve>b__7(IContext context) in c:\Projects\Ninject\Maintenance2.2\ninject\src\Ninject\KernelBase.cs:375 
    System.Linq.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) +32 
    System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +151 
    System.Linq.Enumerable.SingleOrDefault(IEnumerable`1 source) +4222965 
    Ninject.Web.Mvc.NinjectDependencyResolver.GetService(Type serviceType) in c:\Projects\Ninject\Maintenance2.2\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectDependencyResolver.cs:56 
    System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +51 

[InvalidOperationException: An error occurred when trying to create a controller of type 'BossP.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.] 
    System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +182 
    System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80 
    System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74 
    System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +232 
    System.Web.Mvc.<>c__DisplayClass6.<BeginProcessRequest>b__2() +49 
    System.Web.Mvc.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a() +13 
    System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7 
    System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22 
    System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func`1 func) +124 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +98 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8963444 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184 
+1

Vâng, lỗi rõ ràng là trong 'NLog.LogManager.GetCurrentClassLogger()'. Bạn có nguồn cho phương pháp đó và bạn có thể đăng nó không? –

+0

Bạn có định cấu hình NLog trong tệp cấu hình không? Có lẽ một 'HttpModule'? Trong trường hợp đó đối với IIS7, bạn cần cấu hình các công cụ trong thẻ ''. – Steven

Trả lời

1

Vâng, tôi dành 2 đêm điều tra và giải quyết vấn đề này. Ban đầu tôi nghĩ rằng vấn đề liên quan đến khung khai thác NLog vì vậy tôi chuyển sang Log4Net thay thế. Điều đó thật dễ dàng vì tôi đã sử dụng Ninject.Extensions.Logging. Nhưng điều đó không giúp được gì.

Sau đó, tôi đã cập nhật để phát hành phiên bản Ninject và thông báo ngoại lệ trở nên rõ ràng hơn: "Không thể xác định lớp hiện tại cho DynamicInjectorb709a37f02d44e5a8615c5fde4e0746d".

Cuối cùng một số googling chỉ tôi đến thảo luận sau đây: https://groups.google.com/forum/#!msg/ninject/V_bS0ykJxAA/IBnsGVnL50UJ

Giải pháp: "Hãy thử sử dụng phản ánh thay vì bằng cách tạo ra một hạt nhân với một trường hợp NinjectSettings có UseReflectionBasedInjection thiết lập là true"

1

tôi đã trải qua một tương tự vấn đề.

của tôi (đơn giản) giải pháp:

thay thế những dòng

private Logger Logger = LogManager.GetCurrentClassLogger(); 

bởi dòng này

private static Logger Logger = LogManager.GetCurrentClassLogger(); 

Các "readonly" từ khóa là không bắt buộc.

Các vấn đề liên quan