【问题标题】:Cannot debug wcf-windows service无法调试 wcf-windows 服务
【发布时间】:2010-11-08 07:20:20
【问题描述】:

我们的应用程序访问 WCF 服务,该服务由单台计算机上的 Windows 服务托管。客户端应用程序和服务将始终位于同一台计算机上。

我创建了一个托管 WCF 服务的 Windows 服务。为了测试我的 Windows 服务代码,我创建了一个控制台应用程序,其中包含与我的 Windows 服务相同的 app.config 和代码。我在一个调试线程中启动控制台应用程序,并在另一个调试线程中启动我的客户端。一切正常,我可以轻松使用调试器。

现在问题...

所以,我创建了一个安装程序并安装了我的 Windows 服务。成功启动后,我在 Visual Studio 2010 中使用http://localhost/VssService 成功将服务引用添加到我的客户端。我通过“附加到进程”成功附加到服务。我在调试线程中启动了我的客户端,但是当我尝试进入远程方法时,我得到“无法自动进入服务器。调试器未能在服务器进程中停止。” [NetNamedPipeBinding_IVssService] 和 [BasicHttpBinding_IVssService] 都会发生这种情况。我已经为此苦苦挣扎了几个小时并且已经没有想法了,所以我希望你能帮助我。我已经为我的 Windows 服务和客户端应用程序包含了 app.config 文件。希望他们能提供帮助。

感谢您抽出宝贵时间阅读此问题,并希望您能帮助解决此问题...

迈克

===================== SERVICE APP.CONFIG ====================== =======

    <services>
        <service behaviorConfiguration="VssServiceBehavior" name="ClientSaver.VssService.VssService">
            <endpoint address="net.pipe://localhost/VssService/Pipe/" binding="netNamedPipeBinding"
                bindingConfiguration="" contract="ClientSaver.VssService.IVssService" />
            <endpoint address="http://localhost/VssService/" binding="basicHttpBinding"
                bindingConfiguration="" contract="ClientSaver.VssService.IVssService" />
            <endpoint address="http://localhost/VssService/MEX/" binding="mexHttpBinding"
                bindingConfiguration="" contract="IMetadataExchange" />
            <host>
                <baseAddresses>
                    <add baseAddress="http://localhost/VssService/" />
                </baseAddresses>
            </host>
        </service>
    </services>

  <behaviors>
    <serviceBehaviors>
      <behavior name="VssServiceBehavior">
        <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />
        <serviceDebug includeExceptionDetailInFaults="False" />
      </behavior>
    </serviceBehaviors>
  </behaviors>      
</system.serviceModel>

========================== CLIENT APP.CONFIG ================== ===========

            <endpoint address="http://localhost/VssService/" binding="basicHttpBinding"
                bindingConfiguration="" contract="ClientSaver.VssService.IVssService" />                            
        </service>
    </services>

  <behaviors>
    <serviceBehaviors>
      <behavior name="VssServiceBehavior">
        <serviceMetadata httpGetEnabled="true" policyVersion="Policy15" />
        <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>      
</system.serviceModel>

【问题讨论】:

标签: c# wcf


【解决方案1】:

好的。当 VS 调试停止工作时,我使用的一种方法是将 System.Diagnostics.Debugger.Break() 放在服务代码(例如构造函数或方法)中方便的位置。这会导致 JIT 调试器启动,并允许我使用我拥有的任何 VS 实例连接到该服务的代码。

显然你将它从非调试代码中删除。

【讨论】:

    【解决方案2】:

    您不能跨越可执行边界。您需要在服务器代码(即项目)中设置断点。然后从服务器的项目附加到正在运行的 Windows 服务进程(这里要小心......你需要有最新的服务器项目作为 Windows 服务运行)。然后,当您进入 Windows 窗体应用程序时,它会被服务器的断点捕获。

    【讨论】:

    • 当您使用默认 VS 主机运行 WCF 时,您可以跨过可执行边界
    • 但也许他正试图从一个项目(Windows 项目)进入另一个项目(WCF 服务项目)的 WCF 服务,他们可能不在同一个解决方案中......踏入的问题...
    • 也可以通过IIS等方式调试托管服务,总之做一个服务和其他项目一样的解决方案是没有问题的,解决方案不代表什么具体的。跨度>
    【解决方案3】:

    您应该使用 Internet Explorer 作为默认浏览器来调试您的服务...

    【讨论】:

    • 大家好,非常感谢您提出的所有想法。 Ivan 建议不要在 Microsoft 服务中进入我们的方法,而是在另一个调试线程中运行我们的应用程序时在其中设置断点。 :)
    【解决方案4】:

    看看 Windows 的调试工具。这里有几个工具可用于调试 Windows 服务。

    【讨论】:

      【解决方案5】:

      您是否尝试过手动加载调试符号?它曾经发生在我身上,它发生是因为 VS 没有加载符号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多