【问题标题】:ASP.NET Web API - HttpClient.PostAsync local API does not step into codeASP.NET Web API - HttpClient.PostAsync 本地 API 不会进入代码
【发布时间】:2021-12-09 16:38:49
【问题描述】:

这就是我的情况...

我有一个单元测试项目,其中我实例化了一个 Web API 控制器。单元测试项目和 ASP.NET Web API 项目都在同一个解决方案中。 Web API 控制器的实现包括调用 HttpClient.PostAsync 到另一个 Web API 的部分,该 Web API 在另一个解决方案中并部署到本地 IIS。

调用方方法的项目和部署到 IIS 的项目都在 Visual Studio 中打开(打开了 2 个 VS 窗口)。我已经将 pdb 和所有从部署到 IIS 的解决方案复制到单元测试项目的 bin/debug 文件夹中。

但每次控件转到 PostAsync 调用时,当我按 F11 时,它不会进入在另一个 VS 编辑器中打开的代码。

我可以知道我将如何实现这一目标吗?

单元测试项目:

[TestMethod]
public void TestController
{
TestController t = new TestController();
t.Get();
}

测试控制器:

[HttpPost]
public ActionResult Get()
{

//assume that HttpClient.BaseAddress was already set in constructor

client.PostAsync("/testapi/getdata");
}

另一个解决方案中的控制器,部署在 IIS 中

[Route("testapi/getdata")]
[HttpPost]
public ActionResult Get()
{
//implementation here
}

【问题讨论】:

    标签: c# asp.net asp.net-core asp.net-web-api


    【解决方案1】:

    问题是您使用 Post 调用 API,但您的 Api 只接受 Get

    client.PostAsync("/testapi/getdata");
    
    ///Controller in another solution, deployed in IIS
    
    [Route("testapi/getdata")]
    [HttpGet]
    public ActionResult Get()
    

    你必须改变 client.GetAsync 或者你可以使用 post 但改变 api。

    当你使用 async 时,你必须使用 await 或 Result,但 await 更可取

     awant client.GetAsync("/testapi/getdata")
    //or
    client.GetAsync("/testapi/getdata").Result;
    
    ///Controller in another solution, deployed in IIS
    
    [Route("testapi/getdata")]
    [HttpGet]
    public ActionResult Get()
    
    // but should be
    public async Task<ActionResult> Get()
    

    更新

    你已经更新了你的问题,但是在这之后它看起来更加奇怪

    [Route("testapi/getdata")]
    [HttpPost]
    public ActionResult Get()
    

    对于没有任何输入参数和空请求正文的 getdata,您选择 HttpPost。

    client.PostAsync("/testapi/getdata");
    

    它甚至不会被编译,因为帖子需要内容。

    我想知道 API 控制器是什么样的。它也有属性路线吗?还是你所有的代码都是假的?

    【讨论】:

    • 编辑了代码。忘了一定是HttpPost
    • @Joseph 你没有修复另一个错误,因为你使用异步你必须使用等待或结果。
    • 我没有粘贴完整的代码,因为我只是手动输入的。是的,我知道异步/等待。我的意思是你知道要点。
    • 你不需要知道控制器长什么样。我只需要知道当断点到达 postasync 调用时,控制如何进入另一个解决方案中的代码。
    • 它永远不会步进,例如,如果您的路线错误,或者您的发布请求错误,与您发布的一样。如果您的代码是假的,甚至无法编译,我们如何为您提供建议。我们只是在周末浪费宝贵的时间。
    【解决方案2】:

    当另一个解决方案未处于调试模式时,您无法在两个解决方案之间共享 Visual Studio 中的调试实例。

    在 Visual Studio 本身中运行其他解决方案(在单独的实例中,在不同的端口上)并在请求应该命中的位置放置一个断点 - Get()。

    确保 API 正在调试模式下运行,而不是在发布模式下运行,以便命中任何断点。

    然后,来自解决方案 1 的请求应该在解决方案 2 的控制器中到达断点,并允许您根据需要单步执行请求。

    附注您不需要为此处理 PDB 文件 - 您的问题是如何运行第二个解决方案/API。

    【讨论】:

    • 我在调试模式下运行单元测试解决方案。当它进入 TestController Get 方法时,控制权转到 PostAsync。当我在控件处于 PostAsync 时按 F11 时,它不会进入在另一个 VS 窗口中的另一个解决方案中打开的代码。 postasync as states 中的代码在 IIS 中的网站中运行
    • 不,您需要在调试模式下运行第二个 API - IIS 没有调试功能。您需要在调试模式下运行其他解决方案才能进入任何内容 - 调试器不能只是将自己附加到任何东西
    • 对第二个 API 的 PostAsync 调用引用了 IIS 网站中的部署应用程序文件夹。你的意思是说我需要在调试模式下运行第二个 API 的代码,然后运行单元测试?
    • 正确,是的 - 正如我在回答中提到的那样,第二个 API 需要在调试模式下运行 - “在 Visual Studio 本身中运行其他解决方案”
    • 它不起作用 - 在第一个解决方案中按 F11 到达 PostAsync 行并且第二个解决方案 API 在调试模式下运行后,它不会进入第二个解决方案中的代码。
    猜你喜欢
    • 2016-11-02
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多