如何调试ASP.net HTTPHandler

18

我在Visual Studio中的HttpHandler上设置了断点。这个HttpHandler是一个.ashx文件,我正试图通过在VS开发Web服务器中运行我的应用程序来调试它。然而,我的断点却没有被触发。

我该如何逐步调试呢?

编辑:我的断点没有被触发。

11个回答

11

回复晚了,但如果之前的回答没有解决你的问题,这可能会有所帮助。

如果你通过复制现有的ashx处理程序创建了自己的处理程序,那么你的问题很可能是你的处理程序的标记文件仍然指向原始处理程序。

默认情况下,VS在双击.ashx文件时打开.ashx.cs文件,因为几乎不需要使用标记文件。

通过右键单击ashx,VS将显示查看标记选项,请确保Class属性不引用旧处理程序。

<%@ WebHandler Language="C#" CodeBehind="MyNewHandler.ashx.cs"
    Class="mynamespace.MyOldHandler" %>

谢谢@Giuseppe,这对我很有帮助,而且很容易被忽视,特别是当从不同项目复制现有处理程序时,忘记更新“Markup”文件的属性以指向新的命名空间 - Anthony Walsh
非常感谢您的答案,只有这个对我有帮助! - user4628051
我们是在讨论 WebHandlers 还是 HttpHandlers,它们是两个不同的东西。HttpHandler 是通过 web.config 注册的,而不是与页面一起注册的。 - AaA

6
我曾经遇到过这个问题,原来是ashx文件没有编译。我猜测它们在运行时编译,因为直到那时我才收到了编译错误。此外,我没有看到黄色死亡屏幕指示HttpCompileException,因为:
  • 我最初打算修复asxh文件中的错误。
  • 我更改了文件以修复错误,但不知不觉中引入了编译错误。
  • 我测试了错误修复,得到了我配置的通用友好异常。
  • 我认为这是我要修复的同一个错误,因为我无法看到真正的异常,也没有检查ELMAH
  • 我设置了断点,但无法弄清楚为什么没有被命中。
最终,我看到了新引入的异常,修复了编译错误,现在断点像应该的那样被命中,尽管调试器最初启动时不会亮起,而是在处理程序被调用时(在我的情况下是由AJAX调用)。

谢谢,这解决了我的问题。在构建项目时没有报告的编译错误。 - pauldendulk
据我所知,ASHX不是HttpHandler,而是WebHandler - AaA

4

在Visual Studio中打开处理程序文件,并按照您所说的设置断点。然后在浏览器中加载Web应用程序(当然要在调试模式下启动应用程序)。如果断点保持灰色并且不变为填充黑色,则您的处理程序可能没有正确注册在Web应用程序中。这通常是问题所在。如果您认为一切都很好,请尝试对整个解决方案进行清理+重建。并将您的项目设置为启动项目(如果您使用多个项目)。通常这已经有所帮助。


你如何注册处理程序?我认为你不必注册*.ashx文件。 - Ronnie Overby
请访问此链接以了解如何注册处理程序:http://msdn.microsoft.com/zh-cn/library/46c5ddfy(VS.80).aspx - MOZILLA
这正是我想要的。可能它没有正确地注册,因此断点永远不会被触发。 - Juri
对我没有用。断点仍然被标记为红色,所以它将被命中,但就像调用处理程序的 Ajax 没有正常工作一样。 - Ortund
你是使用IISExpress还是本地的IIS服务器进行调试? - Tim

2

尝试使用内置的Web服务器进行调试,而不是本地IIS(如果您正在使用本地IIS,则反之亦然)。两个Web服务器之间存在一些细微差别。


每当我在调试Web项目时遇到问题时,这总是我的问题。由于某种原因,Visual Studio 2013似乎默认使用IIS Express...而我从不想要它! - Kik

1
如果您无法通过在应用程序内部的网页访问来调试http处理程序,请尝试直接在Web浏览器中访问处理程序的URL。
例如:
http://localhost/YourSite/YourHandler.ashx

1

对我来说,上述方法都无法在Visual Studio 2015中使用,然而sorinc的回答启示我在处理程序文件的开头附加以下内容:

System.Diagnostics.Debugger.Break();

调试器随后停在我设置的断点处。

1
我尝试了上面的几个建议,但都没有成功。然后我打开了我的web.config文件,解决方案显而易见。在<system.web>节点中,<compilation>节点的debug属性被设置为false。一旦我将其设置为true,重新编译并启用调试,我的断点就被触发了。
<system.web>
   <compilation debug="true" />
</system.web>

1
我发现用于调试Windows服务的方法也适用于HTTP处理程序:
    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方法中,在本地构建并部署调试版本。在Visual Studio中保持项目打开状态,当你的网站调用处理程序时,会弹出一个对话框让你选择该实例。一旦你选择了实例,切换到VS,你会注意到执行正在等待你继续的System.Diagnostics.Debugger.Launch();行。

0

当我使用IIS进行调试时,遇到了同样的问题。

解决方法: * 在IIS中添加一个处理程序映射:将类型指定为您的完全限定处理程序类名称(例如MyCompany.MyApp.MyHandler)。

我的web.config文件还包含了一个httpHandlers元素:

<add verb="*" path="*.p1s" type="MyCompany.MyApp.MyHandler, MyWebService" />

(我的构建程序集是MyWebService.dll)


0
以上的解决方案对我没有用。我已经正确地注册了我的处理程序。
我的处理程序在一个网站项目中(不是Web应用程序)。它被同一Visual Studio解决方案中的另一个网站(测试项目)访问。为了加载调试符号,我设置了解决方案在启动时启动多个项目。首先是我的处理程序,然后是我的测试项目。

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