我在 Visual Studio 的 HttpHandler 中设置了一个断点。HttpHandler 是一个 .ashx 文件,我试图通过在 VS 开发 Web 服务器中运行我的应用程序来进行调试。我的断点没有被击中。
我怎样才能通过它?
编辑:我的断点没有被命中
我在 Visual Studio 的 HttpHandler 中设置了一个断点。HttpHandler 是一个 .ashx 文件,我试图通过在 VS 开发 Web 服务器中运行我的应用程序来进行调试。我的断点没有被击中。
我怎样才能通过它?
编辑:我的断点没有被命中
迟到的回复,但如果您没有找到较早的答案,它可能会起作用。
如果您通过复制现有的 ashx 处理程序创建了处理程序,您的问题很可能是处理程序的标记文件仍指向原始处理程序。
默认情况下,当双击 .ashx 文件时,VS 会打开 .ashx.cs 文件,因为几乎不需要标记文件。
通过右键单击 ashx VS 将显示 View Markup 选项,确保 Class 属性没有引用旧的处理程序。
<%@ WebHandler Language="C#" CodeBehind="MyNewHandler.ashx.cs"
Class="mynamespace.MyOldHandler" %>
我遇到了这个问题,结果发现 ashx 文件没有编译。我猜它们是在运行时编译的,因为在那之前我没有收到编译错误。此外,我没有看到指示 HttpCompileException 的黄屏死机,因为:
最终,我确实看到了新引入的异常,修复了编译错误,现在断点正按应有的方式被击中,尽管在最初启动调试器时它没有亮起,而是在调用处理程序时(通过 AJAX 调用在我的情况下)。
在 Visual Studio 中打开处理程序文件并按照您所说的放置断点。然后在浏览器中加载 Web 应用程序(当然是在调试模式下启动应用程序)。如果断点仍然是灰色并且没有变成黑色,那么您的处理程序可能没有在您的 web 应用程序中正确注册。这主要是问题所在。如果您认为一切都很好,请尝试对整个解决方案进行干净+重建。并将您的项目设置为启动项目(如果您使用多个项目)。通常这已经有所帮助。
尝试使用内置 Web 服务器而不是本地 IIS 进行调试(反之亦然,如果您使用的是本地 IIS)。两个 Web 服务器之间存在细微差别。
我发现用于调试 Windows 服务的方法也适用于 HTTP Handler:
public void ProcessRequest(System.Web.HttpContext objContext)
{
// This will automatically launch a dialog that will allow to attach the process to a new or existing instance of Visual Studio
#if DEBUG
System.Diagnostics.Debugger.Launch();
#endif
[...]
您将上面的代码放在 ProcessRequest 方法中,为 Debug 构建并在本地计算机上部署。保持项目在 Visual Studio 中打开,当您的网站调用处理程序时,将弹出一个对话框,允许选择该实例。选择实例后,切换到 VS,您会注意到执行在 System.Diagnostics.Debugger.Launch(); 线,等你继续。
以上方法均不适用于 Visual Studio 2015,但 sorinc 的响应提示我将以下内容添加到处理程序文件开头附近的某处:
System.Diagnostics.Debugger.Break();
然后调试器在我设置的断点处停止。
我尝试了上述几个建议,但没有任何运气。然后我打开了我的 web.config,解决方案很明显。我在节点中将节点的调试属性 <compilation>
设置为 false <system.web>
。一旦我将此设置为 true,重新编译并启动应用程序并进行调试,我的断点就会被命中。
<system.web>
<compilation debug="true" />
</system.web>
我在使用 IIS 进行调试时遇到了同样的问题。
修复: * 在 IIS 中添加处理程序映射:将类型指定为您的完全限定处理程序类名称(例如 MyCompany.MyApp.MyHandler)。
我的 web.config 也有一个 httpHandlers 元素:
<add verb="*" path="*.p1s" type="MyCompany.MyApp.MyHandler, MyWebService" />
(我构建的程序集是 MyWebService.dll)
上述解决方案对我不起作用。我已经正确注册了我的处理程序。
我的处理程序位于网站项目(不是 Web 应用程序)中。它由同一 Visual Studio 解决方案中的另一个网站(测试项目)访问。为了加载调试符号,我将解决方案设置为在启动时启动多个项目。首先是我的处理程序,然后是我的测试项目。
如果您无法通过从应用程序中的网页访问 http 处理程序来调试它,请尝试直接在 Web 浏览器中访问处理程序的 URL。
例如:
http://localhost/YourSite/YourHandler.ashx
在 Visual Studio 中,查看“调试”菜单。在那里,您会找到 Step Into、Step Over 等,根据您的键盘绑定,您通常可以按 F10。