调试“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() 方法在哪里)的主要内容,如果未能解决你的问题,请参考以下文章

使用重组时在哪里设置`setInterval`?

WCF 服务应用程序或 WCF 服务库? [复制]

在导航控制器中实现滑出菜单时在哪里以及如何设置协议委托?

WCF 服务库和 WCF 服务应用程序之间的区别

Eclipse 中的 Willdfly 8.1 运行时在哪里? [复制]

结合 WCF 服务库和 WCF 服务应用程序