带有 BaseAddress 的 HttpClient 不工作(生产 + 集成测试)?
HttpClient with BaseAddress not working (production + integration test)?
我在生产中的 IIS 中有一个 ASP.NET Core 5 应用程序 运行 + 我对该应用程序进行了集成测试。而且我有一个问题,我不知道如何在集成测试中设置我的 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;
}
如 中所述,斜线 必须 出现在 BaseAddress
和之后的末尾,斜线 不得 出现在相对 URI 的开头。
但是从WebApplicationFactory
创建的测试HttpClient似乎有相反的要求,即斜杠必须出现在相对URI的开头。由于我是从同一个地方获取相对 URI,这给我带来了问题。我的测试从基础测试 class 获取 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);
}
也许从 WebApplicationFactory
创建的 HttpClient 没有我假设的行为。原来问题出在具有 [Route("[controller]")]
属性的 Controller class 中,而其中的 Ping 方法具有 [Route(ApiRoutes.V1.Health.PingGet)]
.
在 IIS 中,ping 在 "/api/v1/ping"
可用(不知道为什么),但是当从 VisualStudio 启动时,swagger 显示实际端点是 "/Health/api/v1/ping"
(这是错误的)。
删除 [Route("[controller]")]
属性解决了问题,现在两个测试都通过了。
我在生产中的 IIS 中有一个 ASP.NET Core 5 应用程序 运行 + 我对该应用程序进行了集成测试。而且我有一个问题,我不知道如何在集成测试中设置我的 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;
}
如 中所述,斜线 必须 出现在 BaseAddress
和之后的末尾,斜线 不得 出现在相对 URI 的开头。
但是从WebApplicationFactory
创建的测试HttpClient似乎有相反的要求,即斜杠必须出现在相对URI的开头。由于我是从同一个地方获取相对 URI,这给我带来了问题。我的测试从基础测试 class 获取 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);
}
也许从 WebApplicationFactory
创建的 HttpClient 没有我假设的行为。原来问题出在具有 [Route("[controller]")]
属性的 Controller class 中,而其中的 Ping 方法具有 [Route(ApiRoutes.V1.Health.PingGet)]
.
在 IIS 中,ping 在 "/api/v1/ping"
可用(不知道为什么),但是当从 VisualStudio 启动时,swagger 显示实际端点是 "/Health/api/v1/ping"
(这是错误的)。
删除 [Route("[controller]")]
属性解决了问题,现在两个测试都通过了。