WCF不能再步入本地托管的服务 - 为什么?

20

我有一个WCF测试服务和一个在同一解决方案中的测试客户端。该服务配置为在本地主机运行(即 "http://localhost:8731/Design_Time_Addresses/MyService/Service")。我运行客户端应用程序,它可以正确调用服务并获得正确的答案。我通过日志验证了它确实在运行与我的计算机本地相连的服务。 但是,在运行客户端时,我无法对服务进行调试。 WCF应该允许直接步进,但是服务上的断点没有被触发,而且也不能通过服务调用进行跟踪。有人见过这种情况吗?

我已经检查了所有明显的问题,例如“是否正在生成PDB文件?”——是的。如果我仅运行服务项目,然后使用一些测试客户端进行测试,则断点会被正确触发。因此,服务上的调试可以正常工作。 我甚至可以显式地“附加到远程进程”,并以此方式调试服务。 但是WCF将不会自动从客户端切换到服务端。


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

23
我也遇到过这种情况,奇怪的是它似乎发生在我更改构建配置后(从x64到x86)。以下是我修复它的方法:
  1. 右键单击解决方案,选择属性。
  2. 在“启动项目”下,从“单一启动项目”切换到“多启动项目”。
  3. 为WCF项目设置操作为“启动”。
尽管我将项目托管在本地IIS服务器中(而不是VS开发服务器),但这种方法可以解决问题,这有点令人困惑。我猜测将项目设置为“启动”也会导致VS附加到调试进程。 http://msdn.microsoft.com/en-us/library/bb157685.aspx

只花了我4个小时才找到这篇帖子。你太厉害了! - Jacob Hulse
我在调试器方面也遇到了类似的问题,但是在我的机器上更改x86/x64配置并没有起作用。客户端和服务器都在32位上运行,但我仍然无法进入服务代码中进行调试。 - Knasterbax
1
这对我没有起作用 :/ - shadowsora
我尝试了这个页面上的所有解决方案,但都没有起作用。最后,我创建了一个新的控制台应用程序,并复制了所有现有文件。然后,我能够进行调试而不使用System.Diagnostics.Debugger.Break()。问题是在我将WCF服务的项目类型从类库更改为控制台应用程序后开始出现的。我想在服务本身内运行主机。然后,我将我的更改还原到原始项目中。 - Ashok Garg
@Ashkok 这是对这个答案的评论,还是你在提出不同的答案? - msulis

4

对于Visual Studio的多配置:

在您的解决方案的“属性页”中,确保您的Web服务的“配置”设置为“Debug”,而不是“Release”。


3
你是否在使用Visual Studio中的自动WCF服务托管功能?您可以通过打开WCF服务项目的项目属性并导航到WCF选项选项卡来检查此功能。是否选中了“在调试同一解决方案中的另一个项目时启动WCF服务主机”复选框?如果是,则说明这就是问题所在。
发生的情况是,在运行客户端时,会创建一个单独的进程来自动托管WCF服务。由于它是一个单独的进程,因此您将无法在调试客户端时“步入”它。您需要运行两个单独的调试会话,一个用于服务,另一个用于客户端。
一个简单的方法是在服务的启动逻辑中放置一个System.Diagnostics.Debugger.Break()的调用。当WCF服务主机自动启动您的服务时,您将被提示调试它,从而允许您为其调试会话打开第二个Visual Studio实例。

我认为这仅适用于WCF服务是自托管的情况,这意味着它不在IIS、VS Dev服务器或WCF服务主机中。或者更简单地说,OP所询问的通常在具有WCF项目的解决方案中“开箱即用” - 您只需进入即可。 - msulis

1

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

最后,我找到了一个方法,我先启动一个新实例(debug->start a new instance)的WCF服务,然后启动客户端,WCF服务中的断点被触发了!


1

不愿意使用WCF服务的另一个原因可能是传递给WCF方法的数据量过大。

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


1
这让我想到“我发送的消息也相当大”(我正在向服务发送二进制文件)。缩小消息的大小,问题得到解决! - Captain Sensible

1
在我的情况下,我使用了发布配置进行发布。你需要在这里选择调试。

enter image description here


1

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


0

我也曾遇到过类似的问题。我的 WCF 服务由 WCF 服务主机 托管,通过 WCF 测试客户端 进行请求测试。 我的问题是由于构建配置名称中有空格导致的。一旦我使用不带空格的配置名称,调试就可以工作了。

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


0

@msulis - 是的,谢谢,这对我有帮助。最近我也将目标CPU从任意更改为x86。如果无法直接回复您的消息,则向您道歉,因此如果这被视为“答案”,请见谅。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接