【问题标题】:WCF can no longer step into a service that's locally hosted -- why not?WCF 不能再进入本地托管的服务——为什么不呢?
【发布时间】:2010-11-21 09:17:16
【问题描述】:

我在同一个解决方案中有一个 WCF 测试服务和一个测试客户端。该服务配置为在本地主机上运行(即“http://localhost:8731/Design_Time_Addresses/MyService/Service”)我运行客户端应用程序,它正确调用服务并返回正确答案。我已经通过日志验证它肯定正在运行我机器本地的服务。 但是,在运行客户端时我无法调试服务。 WCF 应该只允许单步执行,但服务上的断点不会受到影响,并且单步执行服务调用也不起作用。有人见过这个吗?

我已经检查了所有明显的内容,例如“是否正在生成 PDB 文件?” - 是的。如果我自己运行服务项目,然后用一些测试客户端点击它,断点就会正确命中。所以对服务进行调试是有效的。我什至可以明确地“附加到远程进程”并以这种方式调试服务。但是 WCF 不会自动从客户端跳转到服务。

【问题讨论】:

  • 您如何托管您的 WCF 服务?视窗服务? IIS?
  • 不,它通过 Visual Studio 在同一解决方案中本地运行。即,localhost:8731/Design_Time_Addresses/MyService/Service
  • 确保在设置代理时使用正确的端点。我花了一个小时才意识到我指向了一个我在开发中没有的端点。

标签: wcf debugging


【解决方案1】:

您是否在 Visual Studio 中使用自动 WCF 服务托管功能?您可以通过打开 WCF 服务项目的项目属性并导航到 WCF 选项选项卡来检查这一点。 在同一解决方案中调试另一个项目时启动 WCF 服务主机复选框是否已选中?如果是,那么这就解释了问题。

发生的情况是,当您运行客户端时,会创建一个单独的进程来自动托管您的 WCF 服务。因为它是一个单独的过程,所以在调试客户端时您将无法“进入”它。您必须运行两个单独的调试会话,一个用于您的服务,一个用于您的客户端。

一个简单的方法是在服务的启动逻辑中调用 System.Diagnostics.Debugger.Break()。当 WCF 服务主机自动启动您的服务时,系统会提示您对其进行调试,从而允许您为其调试会话打开 Visual Studio 的第二个实例。

【讨论】:

  • 我认为这仅适用于 WCF 服务是自托管的,这意味着不在 IIS、VS 开发服务器或 WCF 服务主机内。或者更简单地说,OP 所询问的内容通常在带有 WCF 项目的解决方案中“开箱即用”——您可以直接进入它。
【解决方案2】:

我也遇到过这种情况。奇怪的是,它似乎发生在我更改构建配置(从 x64 到 x86)之后。以下是我修复它的方法:

  1. 右键单击解决方案,选择属性。
  2. 在“启动项目”下,从“单个启动项目”切换到“多个启动项目”。
  3. 将 WCF 项目的操作设置为“开始”。

即使我将项目托管在本地 IIS 服务器(不是 VS 开发服务器)中,这也解决了它,这有点令人费解。我怀疑将项目设置为“开始”也会导致 VS 附加到进程以进行调试。

http://msdn.microsoft.com/en-us/library/bb157685.aspx

【讨论】:

  • 我只花了 4 个小时就找到了这篇文章。你统治!
  • 我的调试器也有类似的问题,但是更改 x86/x64 配置在我的机器上不起作用。客户端和服务器都在 32 位上运行,但我仍然无法进入服务代码
  • 这并没有为我解决这个问题:/
  • 我尝试了此页面上的所有解决方案,但没有任何效果。最后,我创建了一个新名称的新控制台应用程序,并在那里复制了所有现有文件。然后我可以在不使用 System.Diagnostics.Debugger.Break() 的情况下进行调试。在我将 WCF 服务的项目类型从类库更改为控制台应用程序后,问题就开始发生了。我想在服务本身内运行主机。然后我恢复了对原始项目的更改。
  • @Ashkok 这是对此答案的评论,还是您提出不同的答案?
【解决方案3】:

我有类似的问题。 WCF 由 WCF 服务主机 托管,请求由 WCF 测试客户端 测试。 我的问题是由构建配置名称中的空格引起的。一旦我使用不带空格的配置名称,调试就起作用了。

我猜真正的问题是构建输出文件夹以配置名称命名的文件夹结尾。

【讨论】:

    【解决方案4】:

    @msulis - 是的,谢谢,这为我解决了问题。我最近也将目标 CPU 从任何更改为 x86。由于某种原因,我无法直接回复您的消息,如果这是作为“答案”出现,我们深表歉意。

    【讨论】:

      【解决方案5】:

      是的,我遇到了同样的问题,WCF 使用了另一个进程。

      终于找到了一个办法,我先启动一个WCF服务的新实例(debug->启动一个新实例),然后启动客户端,WCF服务中的断点命中!

      【讨论】:

        【解决方案6】:

        此外,当使用 VS 调试并将其附加到 w3wp.exe 进程并且您具有除 http:80:* 之外的特定端口绑定时,您必须将 VS 中的 debug > web 设置为站点并且端口 http 正在运行。

        【讨论】:

          【解决方案7】:

          对于 Visual Studio 多配置:

          在您的解决方案的属性页中,确保您的网络服务的“配置”设置为“调试”,而不是“发布”。

          【讨论】:

            【解决方案8】:

            不进入 WCF 服务的另一个原因可能是传递给 WCF 方法的数据的大小。

            例如,我传递了一个大小为 1000 的 dobules 数组,并且在查看该方法的运行方式时收到了错误的请求错误 (400)。我将大小设为 500,现在它可以调试 WCF。

            【讨论】:

            • 这让我觉得“我发送的消息也很大”(我正在向服务发送二进制文件)。减小了消息的大小并解决了问题!
            【解决方案9】:

            就我而言,我使用发布配置发布了它。您需要在此处选择调试。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-04-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-07-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多