ASP.NET Web API - HttpClient.PostAsync 本地 API 不会进入代码

Posted

技术标签:

【中文标题】ASP.NET Web API - HttpClient.PostAsync 本地 API 不会进入代码【英文标题】:ASP.NET Web API - HttpClient.PostAsync local API does not step into code 【发布时间】: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

【问题讨论】:

【参考方案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 在调试模式下运行后,它不会进入第二个解决方案中的代码。

以上是关于ASP.NET Web API - HttpClient.PostAsync 本地 API 不会进入代码的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Web API 2第三课——.NET客户端调用Web API

Web API1.1 ASP.NET Web API入门

Asp.Net Web API 2第六课——Web API路由和动作选择

Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

Asp.Net Web API 2第七课——Web API异常处理

将文件从 ASP.NET Core Web api 发布到另一个 ASP.NET Core Web api