【问题标题】:Step into a web service application from a web forms application从 Web 表单应用程序进入 Web 服务应用程序
【发布时间】:2014-02-12 17:13:09
【问题描述】:

我正在尝试调试我在 C# 中使用 VS2012 创建的 Web 服务。 我以 Web 表单应用程序的形式创建了一个测试应用程序,它调用 Web 服务中的方法。它们都在我的本地计算机上。

我需要能够进入 Web 服务应用程序进行调试,并且我查看了其他尝试做同样事情的人提供的所有信息。但我似乎无法让它进入服务方法。

这些应用程序位于单独的解决方案工作区中。我尝试将两个应用程序都设置为启动应用程序,但在多个解决方案窗口中只出现一个。我尝试将 Web 服务进程附加到 Web 应用程序,但这也不起作用。

谁能描述我如何进入从 Web 表单应用程序调用的 Web 服务?

【问题讨论】:

  • 您是否附加了 w3wp.exe?
  • 当我尝试附加进程时,我在“可用进程”中看不到该进程。
  • 检查:1.显示所有用户的进程 2.显示所有会话中的进程
  • 我选中了“显示所有用户的进程”。我看不到在哪里可以指示“在所有会话中显示进程”。进程窗口中仍然没有 w3wp.exe。
  • 尝试访问本地主机上的页面 w3wp 不会显示,除非 Web 应用程序的实例正在运行。

标签: c# asp.net wcf web-services visual-studio-2012


【解决方案1】:

适用于任何试图弄清楚如何调试 Web 服务的人。您需要执行以下操作:

  1. 启动调用 Web 服务的 Web 应用程序。在调用 Web 服务方法之前在某处放置断点。
  2. 当您遇到断点时,转到 Web 服务项目并转到 调试 -> 附加到进程
  3. 在此附加到进程对话框中,滚动浏览可用进程并找到: w3wp.exe
  4. 单击附加按钮将网络服务附加到网络应用进程。

当您单步执行您的网络应用程序时,您应该能够单步执行网络服务方法。

【讨论】:

    【解决方案2】:

    假设您的 Web 服务已部署并正在运行,并且您很难中断 Web 服务代码:

    首先,确保 Web 服务部署在调试配置(项目属性)中 - 这意味着调试符号是在编译时生成的。

    其次,确保它实际上是在“监听”,即没有 IP/端口冲突或其他问题。

    第三,确保您启用了即时调试(请参阅我的评论)。

    在您的网络服务代码中添加此行,您希望网络服务停止:

    System.Diagnostics.Debugger.Break();

    或者您可以通过代码附加它,然后使用断点:

    System.Diagnostics.Debugger.Launch();

    现在,忘记其他假设。另一种方法 - 你的问题没有说明为什么这不起作用 - 是通过在其 Visual Studio 解决方案中点击 Debug 来简单地运行/托管你的 Web 服务,Web 服务(它是 .asmx 文件)是启动项目.如果可行,您实际上可以将 VS 调试器附加到正在运行的进程,并且可以设置断点。

    在这两种情况下,您都需要了解服务正在侦听的 IP 地址和端口组合,并在测试器中使用该地址。

    【讨论】:

    • 如何将 Web 服务附加到 Web 应用程序?
    • 假设您的 Web 服务托管在本地 IIS 下。当上述语句嵌入到您的代码中时,当您的 Windows 窗体应用程序“点击”Web 服务时,您应该会收到 "Just in Time Debugging" 提示符,这将帮助您附加到运行您的 Web 服务的进程。
    【解决方案3】:

    您可以简单地使用CTRL + ALT + P 将该服务附加到进程,然后找到您的服务正在运行的端口。然后您必须使用WebRequest 在您的网络表单中使用该服务来完成调试过程。

    这是示例

    在项目中使用 WCF 的代码

    #region Calling LOGIN Serv
    
            string URL = "http://localhost:32319/ServiceEmployeeLogin.svc/login";
            WebRequest wrGETURL;
            wrGETURL = WebRequest.Create(URL + "/" + emp_username + "/" + emp_password + "/" + emp_type);
            wrGETURL.Method = "POST";
            wrGETURL.ContentType = @"application/json; charset=utf-8";
            HttpWebResponse webresponse = wrGETURL.GetResponse() as HttpWebResponse;
    #endregion
    

    【讨论】:

    • 请注意,这可能是您使用 WCF REST 服务的方式 - SOAP 服务会有所不同。
    • 是的@JohnSaunders 使用 SOAP 服务的过程。完全不同,它比 REST 更容易。
    • 我正在使用 SOAP 服务。抱歉,忘了说
    • 那么你可以简单地关注这个link希望这能解决你的问题。
    • 该视频只是告诉您必须将网络服务添加到网络应用程序。我需要知道如何从 Web 应用程序进入 Web 服务。
    【解决方案4】:

    您是否通过 Visual Studio 运行您的解决方案,如果是,您需要在每个解决方案中设置断点并从 VS.Net 启动应用程序。 VS 会自动处理附加进程并侵入你的代码

    【讨论】:

    • 我在两种解决方案中都有断点。当我启动 Web 表单应用程序并尝试进入 Web 服务方法时,它会跳过它。我没有收到任何错误,但是 Web 服务方法应该在数据库中插入一条记录,但它没有。
    【解决方案5】:

    打开 2 个 Visual Studio 实例,一次加载作为 Web 服务的解决方案,第二次加载使用此 Web 服务的解决方案。设置断点并在调试模式下运行第一个 VS/解决方案,本地 asp.net 开发服务器应该以http://localhost:5152/

    为例

    在第二个 VS/Solution 中使用来自第一个(本地 asp.net 开发服务器)的 URL,包括必要的路径,例如 http://localhost:5152/yourwebservicepath/webservicename

    可能在调试前将其放入 web.config 中

    运行第二个 VS/解决方案,一旦这个项目将调用 web 服务,第一个 VS 应该开始在任务栏中闪烁,表明断点被击中,切换到第一个 VS 并从那里逐步执行。

    请注意,如果您调试时间过长,第二个 VS/应用程序将遇到服务器超时,因为它被断点保留

    更新: 其他方式:

    如果 Web 服务项目和使用应用程序在同一个解决方案中: 将web服务项目设置为启动项目并开始调试 在解决方案资源管理器中右键单击正在使用的应用程序,选择调试 -> 启动新实例。现在您可以从一个 VS/同一个解决方案同时调试两个应用程序

    【讨论】:

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