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
Asp.Net Web API 2第六课——Web API路由和动作选择
Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化