【问题标题】:HttpClient with BaseAddress not working (production + integration test)?带有 BaseAddress 的 HttpClient 不起作用(生产 + 集成测试)?
【发布时间】:2021-05-03 06:58:49
【问题描述】:

我有一个 ASP.NET Core 5 应用程序在生产环境中的 IIS 中运行 + 我对该应用程序进行了集成测试。而且我有一个问题,我不知道如何在集成测试中设置我的 HttpClient 以与“生产”服务器(在我的本地 IIS 上运行的服务)和TestServer 一起工作。

这就是我实例化 HttpClient 的方式:

    private static HttpClient GetHttpClient(bool isProductionServer)
    {
      if (isProductionServer)
      {
        return new HttpClient {BaseAddress = new Uri("http://localhost/myservice/")};
      }

      var appFactory = new WebApplicationFactory<Startup>();
      var testClient = appFactory.CreateClient();
      return testClient;
    }

Why is HttpClient BaseAddress not working? 中所述,斜杠必须出现在BaseAddress 的末尾,之后,斜杠不得出现在相对 URI 的开头.

但似乎从WebApplicationFactory 创建的测试 HttpClient 具有相反的要求,即斜杠 必须 出现在相对 URI 的开头。由于我从同一个地方获取相对 URI,这给我带来了问题。我的测试是从基础测试类获取 httpClient 实例,并且测试不应该关心它们是针对 IIS 还是 TestServer 执行的。知道如何进行这项工作吗?为 TestServer 创建 httpClient 时可能进行一些设置?

为了进一步说明问题,请看以下两个测试:

    [Test]
    public async Task TestRequestOnTestServer()
    {
      // works only for: "/api/v1/ping", but not for "api/v1/ping" - I get 404 response
      string route = ApiRoutes.V1.Health.PingGet;
      var client = GetHttpClient(false);
      var response = await client.GetAsync(route);
      Assert.That(response.IsSuccessStatusCode);
    }
    [Test]
    public async Task TestRequestOnProductionServer()
    {
      // works only for: "api/v1/ping", but not for "/api/v1/ping" - I get 404 response
      string route = ApiRoutes.V1.Health.PingGet;
      var client = GetHttpClient(true);
      var response = await client.GetAsync(route);
      Assert.That(response.IsSuccessStatusCode);
    }

【问题讨论】:

  • 您是否有从appFactory.CreateClient 返回的自定义HttpClient?自定义客户端可能具有更改其工作方式的自定义行为。
  • 在创建HttpClient 时,您是否有任何理由不使用IHttpClientFactory
  • @Robert 如果您找到了自己问题的答案,请留下帖子并将其标记为答案。
  • @PeterCsala:感谢您的提示-添加了答案。 @King King:使用标准HttpClient,似乎问题出在控制器上。 @smoksnes:不确定在测试中使用 IHttpClientFactory 有什么好处。 here 描述的用例似乎都不适用于我的用例。

标签: c# asp.net-core integration-testing dotnet-httpclient


【解决方案1】:

也许从WebApplicationFactory 创建的 HttpClient 没有我认为的行为。原来问题出在具有[Route("[controller]")] 属性的Controller 类中,而其中的Ping 方法具有[Route(ApiRoutes.V1.Health.PingGet)]

在 IIS 中 ping 可在 "/api/v1/ping" 获得(不知道为什么),但从 VisualStudio 启动时,swagger 显示实际端点是 "/Health/api/v1/ping"(这是错误的)。

删除[Route("[controller]")] 属性解决了问题,现在两个测试都通过了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2019-08-18
    • 2023-04-05
    相关资源
    最近更新 更多