可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have set a breakpoint in an HttpHandler in visual studio. The HttpHandler is an .ashx file I am trying to debug by running my application in the VS development web server. My breakpoint is not getting hit.
How can I step through it?
Edit: My breakpoint is not getting hit
回答1:
Open the handler file in Visual Studio and place the breakpoint as you said. Then load the web application in your browser (starting your application in debug-mode of course). If the breakpoint remains gray and doesn't turn filled black, then your handler is probably not registered appropriately in your webapp. That's mostly the issue. If according to you everything is fine, try doing a clean + rebuild of your entire solution. And set your project as startup project(if you're using multiple projects). Often that helps already.
回答2:
Late reply, but it may serve if you have not found your answer with earlier ones.
If you have created your Handler by copying an existing ashx handler your problem may well be that the markup file of your handler is still pointing to the original handler.
VS by default opens the .ashx.cs file when double-clicking on the .ashx file as the markup file is almost never needed.
By right-clicking on the ashx VS will show option to View Markup, make sure that the Class property is not referring to the old handler.
<%@ WebHandler Language="C#" CodeBehind="MyNewHandler.ashx.cs"
Class="mynamespace.MyOldHandler" %>
回答3:
I had this problem and it turns out that the ashx file didn't compile. I guess they get compiled at runtime because I didn't get a compile error until then. Additionally I wasn't seeing the Yellow Screen of Death indicating an HttpCompileException because:
- I originally intended to fix a bug in the asxh file.
- I made changes to the file to fix the bug, in which I unknowingly introduced a compile error.
- I tested the bug fix, got the all purpose friendly exception I had configured in custom errors.
- I assumed it was the same bug I had gone into fix because I couldn't see the true exception a la Yellow Screen of Death and didn't bother checking ELMAH
- I set a breakpoint, and couldn't figure out why it wasn't being hit.
Eventually I did see the newly introduced exception, fixed the compile error, and now the breakpoint is being hit like it should, although it doesn't light up when the debugger is initially launched, rather when the handler is invoked (by an AJAX call in my case).
回答4:
Try do debug using the built in web server instead of the local IIS (or vice-versa if you're using the local IIS). There are minor differences between the two web servers.
回答5:
None of the above worked for me with Visual Studio 2015 however sorinc's response clued me in to add the following to somewhere near the start of the handler file:
System.Diagnostics.Debugger.Break();
The debugger then stopped at breakpoints I had set.
回答6:
I tried a couple of the above suggestions without any luck. Then I opened my web.config and the solution was obvious. I had the debug attribute of the <compilation>
node set to false in the <system.web>
node. Once I set this to true, recompiled, and started the application with debugging, my breakpoint got hit.
<system.web>
<compilation debug="true" />
</system.web>
回答7:
I had the same problem when debugging using IIS.
Fix:
* Add a handler mapping in IIS: Specify the type as your fully qualified handler class name (e.g. MyCompany.MyApp.MyHandler).
My web.config also had an httpHandlers element:
<add verb="*" path="*.p1s" type="MyCompany.MyApp.MyHandler, MyWebService" />
(where my built assembly was MyWebService.dll)
回答8:
The above solutions didn't work for me. I already had my handler registered correctly.
My handler is in a web site project (not a web application). It is accessed by another web site (a test project) in the same Visual Studio solution. To get debug symbols to load, I set the solution to start multiple projects on startup. First my handler, then my test project.
回答9:
If you're failing to debug an http handler by accessing it from a web page within your app, try accessing the handler's URL directly within your web browser.
for example:
http://localhost/YourSite/YourHandler.ashx
回答10:
I found the method used to debug Windows services also works for the 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
[...]
You put the code above in your ProcessRequest method, you build for Debug and deploy on your local machine.
Keeping the project open in Visual Studio, when your website invokes the handler, a dialog will pop up allowing to choose that instance. Once you select the instance, switch to VS and you will notice execution is on the System.Diagnostics.Debugger.Launch(); line, waiting for you to continue.
回答11:
In Visual Studio, Check out the Debug menu. In there you will find Step Into, Step Over etc, and depending on your keyboard binding you can typically hit F10.