调试“WCF 服务库”时在哪里可以设置 try-catch 块(即入口点/Main() 方法在哪里)
Posted
技术标签:
【中文标题】调试“WCF 服务库”时在哪里可以设置 try-catch 块(即入口点/Main() 方法在哪里)【英文标题】:Where can I set a try-catch block when debugging a `WCF Service Library` (i.e. where is the entry point / Main()-method) 【发布时间】:2016-07-20 08:09:21 【问题描述】:这是我的情况:我在 Win 10 64 位机器上使用 Visual Studio 2015 和 .NET Framework 4.6.1 来构建 WCF 服务。
在我的解决方案中,我有几种不同的项目类型,主要是纯 C# Class Library
(类库)、一些 C++
-dll 引用,当然还有 WCF Service Library
本身。
在我继续之前,我想声明这是我第一次与 WCF 约会...
这个 SO 问题正在解决一个类似的问题,Where is the startup method of a WCF Service?,但由于我在几年后处理了一个WCF Service Library
,当时提出了原始问题,而且原始问题没有使用相同的项目类型,我相信(?)那里的答案不适合我的问题。至少在调试时不是?
在我的解决方案中,我已将我的 WCF Service Library
-project 设置为 StartUp 项目。当按下 F5 键(开始)时,我得到的是:
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
at System.Reflection.Assembly.GetTypes()
at Microsoft.Tools.SvcHost.ServiceHostHelper.LoadServiceAssembly(String svcAssemblyPath)
好的,通常,在普通的 C# Console Application
中,我会在 Main()
方法中设置一个 try-catch-block 来检查我的问题。但是我的WCF Service Library
-project 好像没有这样的。
我的问题:我怎样才能知道LoaderException
属性是什么?
编辑 1:我尝试了@user497745 的答案(两个建议),第一个帮助了我:
-
我启动了 Visual Studio > 调试 > Windows > 异常设置
并提供以下设置:
启动我的容易出错的 WCF 项目时,我仍然收到与以前相同的消息
当尝试@user497745 建议的另一个选项时,禁用 Visual Studio > 调试 > 选项 > 调试 > 常规 > Just My Code,我更接近我的异常:
我通过在我的 App.config 文件中为
WCF Class Library
添加部分来尝试使用诊断跟踪的第二个建议。
这是我的App.config
的一部分:我以管理员身份启动了运行 Visual Studio 2015 的应用程序诊断> 来源>行为> 服务行为> 行为> 主机> 服务> 服务>
C:\Users\haunsTM\Desktop\WinService\debuglog.svclog
在运行后是空的。【问题讨论】:
如果不使用 Visual Studio 中的一些技巧或通过诊断捕获异常信息,我认为您无法真正捕获直接引发异常的确切时刻。我在下面发布了一个带有几个选项的答案。 【参考方案1】:因此,如果您试图中断调试器以在错误发生时捕获错误,我会推荐一种不同的方法。
要么:
转到 DEBUG > Exceptions 并选择 Common Language Runtime Exceptions > System.Reflection 并检查您得到的确切异常类型。我不确定您是否还需要在“调试”>“选项”中取消选中“仅启用我的代码”。并且也许检查“启用 .NET Framework 源步进”。然后当异常发生时,Visual Studio 应该会中断并允许您像查看任何异常一样查看异常详细信息。
通过将以下内容添加到 WCF 类库的 App.config 文件来添加诊断跟踪。然后尝试启动库,在收到错误消息后,停止调试器并在 SvcTraceViewer 中打开生成的跟踪文件(位于您在下面选择的任何路径和文件名中)。您可以打开 Visual Studio 开发人员命令提示符并从那里启动它。
<system.serviceModel>
<diagnostics>
<messageLogging
logEntireMessage="true"
logMalformedMessages="false"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="false"
maxMessagesToLog="3000"
maxSizeOfMessageToLog="2000"/>
</diagnostics>
</system.serviceModel>
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="All"
propagateActivity="true">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging" switchValue="All">
<listeners>
<add name="xml" />
</listeners>
</source>
</sources>
<sharedListeners>
<add initializeData="[SOME_PATH]\[SOME_FILENAME].svclog" type="System.Diagnostics.XmlWriterTraceListener"
name="xml" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>
【讨论】:
我想initializeData="[SOME_PATH]\[SOME_FILENAME].svclog"
可能类似于initializeData="C:\Users\haunsTM\Desktop\WinService\debuglog.svclog"
?
没关系!不知何故,配置管理器中的构建复选框已取消选中我的可执行文件。现在(检查后)我收到一条日志消息。不幸的是,它并没有告诉我有关错误的任何信息。你的第一个提示给了我一个线索。我会将此标记为答案!
嗯,第一个想法怎么样,打破例外。那有帮助吗?您可能能够准确地在抛出异常时中断并在该点查看。
首先感谢您的帮助!好吧,在 EDIT 1 部分,我截取了“来源不可用”的屏幕截图。它告诉我某处的 BadImageFormatException (...) 我认为这与 x64/x86 问题有关?我的解决方案中的每个项目都构建为 x86(包括其引用的第三方 dll),就像它们应该的那样。不知道是否可以从“异常窗口”获取更多详细信息?
嗯,你添加的新图片对我来说是断开的链接。如果我能看到这些图片,我可能会提供更多帮助。以上是关于调试“WCF 服务库”时在哪里可以设置 try-catch 块(即入口点/Main() 方法在哪里)的主要内容,如果未能解决你的问题,请参考以下文章