无法调试WCF服务消息

31

我有一个带有WCF服务和客户端的Visual Studio 2008解决方案。

当我运行客户端并从服务调用方法时,我收到一条消息,内容是“无法自动调试'Home.Service'。远程过程无法被调试。这通常表示在服务器上未启用调试。”

我已经搜索过并尝试了以下方法。

<system.web>
   <compilation debug="true" />
</system.web>

已在客户端和服务器上的app.config中添加了此配置。

我还确保该项目正在以调试模式编译。

还有什么可能导致这个消息呢?

编辑:根据反馈问题添加了更多信息。

  • It is using wsHttpBinding
  • I have set

    <serviceDebug includeExceptionDetailInFaults="true"/>
    
  • I am using

    var service = new HomeReference.HomeServiceClient();
    service.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
    

很不幸,在我第一次调用Service上的方法时出现了错误。我可以关闭消息框,然后应用程序继续工作。但是,服务器上抛出的任何异常都没有传播回客户端(我认为应该这样做?)。


你在调试WCF服务时使用的是哪种绑定类型? - Michael Kniskern
我没有对绑定进行任何更改,它设置为wsHttpBinding。 - Frode Lillerud
你是如何托管你的WCF服务的? - Michael Kniskern
根据问题的情况,您可能还需要查看跟踪:http://msdn.microsoft.com/en-us/library/ms733025.aspx - Kwal
12个回答

40

我曾经与这个完全相同的错误斗争了一个多小时,结果重启了VS2008后,它神奇地自己解决了。你也可以试一下,这可能会节省你一些时间。


1
在我经过数小时的谷歌/stackoverflow搜索后,这个解决了我的问题。 - Espo
这对我也解决了问题(我也花了约一个小时来理解到底发生了什么鬼..) - Liron Levi
1
这对我也起作用了。我注意到在重新启动之前,输出窗口中报告了一个奇怪的 IOException,而在重新启动后它消失了。我猜测某些东西导致了 IOException,然后让 VS2010 想要调试它,但它无法 - 可能是因为出现问题的原因相同。奇怪的。 - Allon Guralnek
也使用过VS2012。 - Tilak
对我来说就像魔法一样有效! - a.farkas2508
显示剩余2条评论

14
在我的情况下,问题最终被证明是客户端和服务器之间的安全设置不匹配。我正在使用类似以下的自定义绑定:
<customBinding>
    <binding name="AuthorisedBinaryHttpsBinding" receiveTimeout="00:03:00" sendTimeout="00:03:00">
      <!-- this next element caused the problem: -->
      <security authenticationMode="UserNameOverTransport">
      </security>
      <binaryMessageEncoding>
        <readerQuotas maxDepth="100" maxStringContentLength="1000000"
          maxArrayLength="655360000" />
      </binaryMessageEncoding>
      <httpsTransport />
    </binding>
  </customBinding>

当我移除了上面突出显示的安全元素后,“无法自动调试”消息的问题消失了。
为解决此问题,我首先打开了WCF跟踪。这向我显示了WCF抛出的MessageSecurityException

安全处理器无法在消息中找到安全标头。这可能是因为消息是未安全的故障,或者由于通信方之间存在绑定不匹配。如果服务已配置为安全,则可能会发生这种情况,而客户端未使用安全性。

这指引我查看客户端的绑定设置。结果发现我没有在自定义绑定中添加所需的安全元素。由于我是通过代码实现的,我需要以下内容(请注意第三行):
  var binding = new CustomBinding(
      binaryEncoding,
      SecurityBindingElement.CreateUserNameOverTransportBindingElement(),
      new HttpsTransportBindingElement { MaxReceivedMessageSize = MaxMessageSize, });

至于为什么Visual Studio显示那个错误,我不知道——在我看来应该是一个bug。


我不会将这个作为答案发布,因为它并不是一个答案。但经过数小时的工作,在两台不同的机器上打开和编译解决方案后,一台机器出现了错误,而另一台则没有。这不是配置不匹配的问题。这个 WCF 的东西很好,但还没有完善或成熟。 - Spiked3
微软做的事情不够完善或成熟?我相信这是不可能的。 - user1566694
你是从客户端还是服务器中移除了安全性? - Rashmin Javiya

8

自动附加到服务有以下限制:

  • The service must be part of the Visual Studio solution you are debugging.

  • The service must be hosted. It may be part of a Web Site Project (File System and HTTP), Web Application Project (File System and HTTP), or WCF Service Library project. WCF Service Library projects can be either Service Libraries or Workflow Service Libraries.

  • The service must be invoked from a WCF client.

  • Debugging must be enabled with the following code in the app.config or Web.config file:

    <system.web>
      <compilation debug="true" />
    </system.web>
    
请参考WCF调试限制。如果客户端和服务端在同一个解决方案中但会在不同的进程中运行(例如,如果您正在使用本地IIS服务器进行开发并且正在运行Web应用程序,但与其消耗的服务位于不同的应用程序池中),则可能需要为解决方案启用“多个启动项目”(在解决方案属性 -> 启动项目上)以便调试器可以附加到两者上。为了避免每次调试时都弹出服务浏览器窗口,您可以将“启动操作”(在服务项目属性上)设置为“不打开页面。等待来自外部应用程序的请求。”这些是根据个人经验总结出的,希望能对其他人有所帮助。

7
你可能会看到这个错误的另一个原因(我认为是我的情况)是你正在运行64位Windows。显然,Visual Studio没有任何x64调试器支持。
您可以通过更改使用应用程序的平台目标来解决此问题:
项目属性->生成->将“平台目标”更改为“x86”。
不幸的是,这对我不起作用,因为我正在尝试在需要所有内容以64位模式运行的Windows Azure开发AppFabric中运行!

Visual Studio自VS2005以来就支持x64调试器,因此我认为这本身不是问题。 - Samuel Jack
是的,我认为这可能是与Azure SDK无关的错误。我无法回忆起导致我发布上述内容的确切问题或错误。哦,抱歉给您带来了误导性信息。 - Dave
@SamuelJack,虽然VS确实可以调试x64应用程序,但由于某些原因,如果客户端应用程序使用x64,则WCF服务自动附加功能无法正常工作。但是,我认为将Debug构建设置为使用“x86”,而Release构建仍保持在AnyCPU上没有问题。使用VS2010 + WPF,人们甚至不会遇到这个问题,因为这些应用程序将自动成为x86。 - springy76

1

我也遇到了同样的问题。我在客户端和服务配置文件中都更改了以下内容:

编译调试设置为true。

这对我有用。


0

也有可能在IISExpress和IIS中使用相同的端口号。如果您正在Visual Studio中开发WCF应用程序,并在IISExpress中安装了该应用程序,然后将同一应用程序安装到本地IIS中,请确保不要在IIS和IISExpress中使用相同的端口号。使用相同的端口号会导致此错误消息。


0
在您的 Web 服务 web.config 文件中确保编译调试设置为 true。 这样应该可以解决您的问题!

0
在我的情况下,问题最终是完全不同的事情。我更改了 Web 服务上的操作名称,但忘记更新客户端。由于某种原因,这导致了“无法自动调试…”错误。

0

0

我在Visual Studio 2017中遇到了同样的问题。在解决方案文件夹根目录中删除隐藏的.vs文件夹后,我又可以进行调试了。


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