gpt4 book ai didi

c# - 新 AppDomain 中的 Web 应用程序中的 "The type LogWriter cannot be constructed"

转载 作者:行者123 更新时间:2023-11-30 17:04:42 25 4
gpt4 key购买 nike

我正在尝试在 Web 应用程序中使用 Microsoft Enterprise Library 5.0 Logging Application Block。我可以从主应用程序写入日志,但是当我从第二个 AppDomain 尝试这样做时,任何记录尝试都会引发异常(如下所示)。

完全相同的代码,在控制台应用程序中,工作正常。我已将其缩小为以下测试代码(只需要更改程序集和类型名称常量以匹配您的项目):

public class LogTester
{
public const string LogWriterAssembly = "LogTest";
public const string LogWriterType = "LogTest.LogWriter";

public static void DoLogTest()
{
LogWriter localLogger = new LogWriter();
localLogger.Log("In first AppDomain");

AppDomain domain = GetAppDomain();

LogWriter remoteLogger = (LogWriter)domain.CreateInstanceAndUnwrap(LogWriterAssembly, LogWriterType);
remoteLogger.Log("In second AppDomain");
}

private static AppDomain GetAppDomain()
{
string baseFolder = AppDomain.CurrentDomain.BaseDirectory;

string folder = AppDomain.CurrentDomain.SetupInformation.PrivateBinPath;

if (String.IsNullOrEmpty(folder))
folder = baseFolder;

AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationName = "TestAppName";
setup.ApplicationBase = baseFolder;
setup.PrivateBinPath = folder;
setup.ShadowCopyFiles = "true";

return AppDomain.CreateDomain("TestAppName", null, setup);
}
}

public class LogWriter : MarshalByRefObject
{
public void Log(string message)
{
Logger.Write(AppDomain.CurrentDomain.FriendlyName + ": " + message);
}
}

我使用的日志记录配置只是默认配置(由企业库配​​置实用程序创建):

<configSections>
<section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
</configSections>
<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General">
<listeners>
<add name="Event Log Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FormattedEventLogTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FormattedEventLogTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
source="Enterprise Library Logging" formatter="Text Formatter"
log="" machineName="." traceOutputOptions="None" />
</listeners>
<formatters>
<add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
template="Timestamp: {timestamp}{newline}&#xA;Message: {message}{newline}&#xA;Category: {category}{newline}&#xA;Priority: {priority}{newline}&#xA;EventId: {eventid}{newline}&#xA;Severity: {severity}{newline}&#xA;Title:{title}{newline}&#xA;Machine: {localMachine}{newline}&#xA;App Domain: {localAppDomain}{newline}&#xA;ProcessId: {localProcessId}{newline}&#xA;Process Name: {localProcessName}{newline}&#xA;Thread Name: {threadName}{newline}&#xA;Win32 ThreadId:{win32ThreadId}{newline}&#xA;Extended Properties: {dictionary({key} - {value}{newline})}"
name="Text Formatter" />
</formatters>
<categorySources>
<add switchValue="All" name="General">
<listeners>
<add name="Event Log Listener" />
</listeners>
</add>
</categorySources>
<specialSources>
<allEvents switchValue="All" name="All Events" />
<notProcessed switchValue="All" name="Unprocessed Category" />
<errors switchValue="All" name="Logging Errors &amp; Warnings">
<listeners>
<add name="Event Log Listener" />
</listeners>
</errors>
</specialSources>
</loggingConfiguration>

在控制台应用程序中,一切正常,两条日志消息都已写入。但是,在 Web 应用程序中,我在尝试编写第二条消息时遇到以下异常:

[InvalidOperationException: The type LogWriter cannot be constructed. You must configure the container to supply this value.]

[ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter", name = "(none)".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The type LogWriter cannot be constructed. You must configure the container to supply this value.
-----------------------------------------------
At the time of the exception, the container was:

Resolving Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter,(none)
]

[ActivationException: Activation error occured while trying to get instance of type LogWriter, key ""]
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +10582079
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +336
MvcApplication1.Controllers.LogWriter.Log(String message) in c:\dev\Sage Data Cloud\Development\MvcApplication1\MvcApplication1\Controllers\DefaultController.cs:65
MvcApplication1.Controllers.LogTester.DoLogTest() in c:\dev\Sage Data Cloud\Development\MvcApplication1\MvcApplication1\Controllers\DefaultController.cs:38
MvcApplication1.Controllers.DefaultController.Index() in c:\dev\Sage Data Cloud\Development\MvcApplication1\MvcApplication1\Controllers\DefaultController.cs:18
lambda_method(Closure , ControllerBase , Object[] ) +101
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +59
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +435
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +60
System.Web.Mvc.Async.AsyncControllerActionInvoker.InvokeSynchronousActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +50
System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +75
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +44
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +139
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +49
System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +126
System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +323
System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +44
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +139
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +50
System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +68
System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +184
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +136
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +40
System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +40
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +151
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +44
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +151
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +39
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +39
System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +45
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +47
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +151
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +40
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9629708
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

我有对所需企业库程序集的引用,因此 Logging、ServiceLocation、Unity 和 Unity.Configuration 程序集被复制到本地。

我已经尝试使用 .NET Reflector 调试企业库代码,但是对象创建都是使用动态生成的代码完成的,我无法介入(而且我不想尝试进行逆向工程)来自未注释的反编译源!)。

只是想知道是否有人以前遇到过这个问题,以及可能的解决方案?在其他任何地方都找不到同样的问题。

提前致谢。皮特

最佳答案

您需要设置新的AppDomain的配置文件,这样Enterprise Library才能在新的AppDomain中进行配置。您可以使用 AppDomainSetup.ConfigurationFile 执行此操作属性:

AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationName = "TestAppName";
setup.ApplicationBase = baseFolder;
setup.PrivateBinPath = folder;
setup.ShadowCopyFiles = "true";
setup.ConfigurationFile =
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

关于c# - 新 AppDomain 中的 Web 应用程序中的 "The type LogWriter cannot be constructed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17218870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com