【问题标题】:Visual Studio breakpoint inside HttpClient.GetAsync call not getting hitHttpClient.GetAsync 调用中的 Visual Studio 断点未命中
【发布时间】:2016-03-14 20:53:25
【问题描述】:

我正在尝试从我的 .NET Web 服务中的测试脚本调试异步调用,但我的异步调用中的断点永远不会被命中。我什至尝试在其中放置一个 Debugger.Break() 。下面是调用代码...

        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(ConfigurationManager.AppSettings["BaseAddress"]);
        string uri = "/api/Rd_Regions";

        // Below is the line of code I want to step into, but it won't step into the 'client.GetAsync(uri)'...
        HttpResponseMessage response = await client.GetAsync(uri);
        if (response.IsSuccessStatusCode)
        {
            // Convert the result into business object
            // Do stuff...
        }
        else do other stuff...

应该在断点所在的位置调用 web 服务的部分,首先是 web api 的上下文,然后是被调用的方法。如果它停在其中一个,我会很高兴......

public partial class PIMSContext : DbContext
{

    public PIMSContext()

    : base(new OracleConnection(Security.ConfigurationReader.GetAppSetting("PIMS")), true)
    //: base(new OracleConnection(ConfigurationManager.ConnectionStrings["PIMS"].ConnectionString), true) 
etc....

这是最终调用的方法:

    // GET: api/RD_REGIONS
    public IQueryable<RD_REGIONS> GetRD_REGIONS()
    {
        // I want the debugger to stop here!
        Debugger.Break();
        return db.RD_REGIONS;
    }

我错过了什么吗?不能单步执行这个异步调用吗? 任何见解都值得赞赏。

【问题讨论】:

  • 你在用测试方法调试吗?还是通过网络浏览器?
  • 是的,我正在通过 Visual Studio Online 2015 中的测试方法调试服务。我在调试模式下构建并在异步调用之前的行停止,当我尝试 F11 时(步骤into) 异步调用它只是跳到下一行。

标签: c# asynchronous visual-studio-debugging


【解决方案1】:

忘记更新之前的答案 - 结果我不小心在发布模式(VS2015)下调试。切换到调试模式修复了它 - 所有断点开始按预期运行。

【讨论】:

    【解决方案2】:

    如果我的理解正确 - 上面列出的所有断点都没有被命中?不在等待 client.GetAsync(uri);不在网络服务 GetRD_REGIONS() 中? client.GetAsync 后面的代码是不是没有到达?

    如果是真的 - 也许这个方法永远不会完成?

    await client.GetAsync(uri);
    

    您可能在这个地方遇到了异常。尝试用 try/catch 包围您的 GetAsync 方法,并将断点放在 catch 块内。像这样的:

    ...
    HttpResponseMessage response = null;
    try {
      response = await client.GetAsync(uri);
    } 
    catch (Exception e) {
      throw e; //breakpoint goes here
    }
    ...
    

    有时,由于您的方法是异步的,调试器或事件日志无法全局注册未处理的异常。您只能通过 try/catch 获得此异常。

    【讨论】:

    • 唯一被击中的断点是这一行的断点,这就是我尝试进入的地方,它只是跨过... HttpResponseMessage response = await client.GetAsync(uri);我尝试了你的建议,谢谢......不幸的是没有抛出错误,response.IsSuccessStatusCode 只是返回 false 并且代码继续。
    • 事实上,您没有异常意味着 HttpClient.GetAsync 工作正常。查看调试器监视中的响应对象。有哪个 http 状态码? 404? 500?我认为,您的第二个应用程序无法处理该请求。您的 web-api 中的路由 / ActionFilters 可能有问题?尝试检查 url / 路由和响应对象。
    • 响应错误是 404。我认为问题与连接有关,因为如果您查看我连接到数据库的上下文代码行,您会在下面看到一条注释行它曾经从connectionString获取Oracle连接的地方......当它这样做时它工作了,但我现在需要使用ConfigurationReader从一个键中获取连接......这是我改变的唯一一行从那以后它就坏了。我无法走进这条线,看看它为什么被打破了。是不是不能进入 GetAsync() 调用来查看它在做什么?
    • 您正在通过 http 协议调用您的 API 方法。控制器内部发生的事情是另一个问题。因此,如果您的 API 操作中的制动点未命中,则意味着在请求到达此操作之前发生了一些事情。
    • 404 是在 web-API 应用程序之外(在网络级别或 web 服务器上)或在应用程序内部引起的,但在操作之前(例如在路由/数据绑定中),HttpClient 不是问题的事情。如果 GetRD_REGIONS() 中的断点未命中 - 这意味着未正确处理 Web 请求。附:如果你想看看 HttClient 源代码 - 你应该使用反编译器,因为这个类是在 System-libraries 中声明的。
    猜你喜欢
    • 2014-03-02
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2018-01-21
    • 2019-07-17
    • 1970-01-01
    相关资源
    最近更新 更多