我们刚刚升级到 .net 7,集成测试中的所有 http 调用都开始出现错误:
Message:
System.FormatException : The format of value '' is invalid.
Stack Trace:
HttpHeaderParser.ParseValue(String value, Object storeValue, Int32& index)
HttpHeaders.ParseAndAddValue(HeaderDescriptor descriptor, HeaderStoreItemInfo info, String value)
HttpHeaders.Add(HeaderDescriptor descriptor, String value)
CookieContainerHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
这些测试在 .net 5 和 .net 6 中运行良好。
这是一个示例测试 -
public async Task ShouldGetStatusOfRunFromAPI()
{
var client = CreateClient(this.mockApiServer.Uri.ToString());
HttpResponseMessage response = await client.GetAsync(StatusAPIForAuroraRun1ContextPath);
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
我没有明确设置任何标头,但错误并没有明确它期望哪个值不能为空。
这是 TestStartup 中的 CreateClient 方法 -
protected HttpClient CreateClient(string uri)
{
var projectDir = Directory.GetCurrentDirectory();
var factory = new WebApplicationFactory<Program>();
var config = TestConfigurationHelper.LoadConfiguration();
return factory
.WithWebHostBuilder(builder =>
{
builder.ConfigureTestServices(services =>
{
services.Configure<ClassOptions>(options => config.GetSection(ClassOptions.Name).Bind(options));
SomeService someService = NewService(config);
services.AddSingleton(someService);
Kubernetes kubernetesClient = NewKubernetesClient(uri);
services.AddSingleton<IKubernetes, Kubernetes>((svcProvider) => kubernetesClient);
services.AddSingleton<ISecretProvider, SecretProvider>((svcProvider) => NewSecretProvider());
})
.ConfigureAppConfiguration((context, builder) =>
{
builder.AddConfiguration(config);
});
})
.CreateClient();
}
错误消息显示添加某些标头时失败,但我如何知道哪个标头值失败? Accept 的值已设置,我也尝试使用 -
显式设置它client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
但这也因同样的错误而失败。
根据我对这个问题的评论,这是
CookieContainerHandler
中的一个问题:看起来如果您升级 Microsoft.AspNetCore.Mvc.Testing
参考,它就会解决它;这就是我现在在我的双出版图书馆中拥有的内容:
<PackageReference Condition="'$(TargetFramework)' == 'net6.0'" Include="Microsoft.AspNetCore.Mvc.Testing" Version="3.1.18" />
<PackageReference Condition="'$(TargetFramework)' == 'net7.0'" Include="Microsoft.AspNetCore.Mvc.Testing" Version="7.0.0" />
这是“CookieContainerHandler”中的问题。请升级您的“Microsoft.AspNetCore.MVC.Testing”。
23 年 10 月 24 日更新: 尝试在我的 Web API 项目中安装和更新包
Microsoft.AspNetCore.MVC.Testing
,即使它是一个 Web API 项目.. 哈哈
我更新到7.0.12了,还是不行。
这是我添加的:
request.Headers.Accept.ParseAdd("text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7");
这是错误消息。请注意,验证已添加间距等。
System.FormatException: The format of value 'text/html, application/xhtml+xml, application/xml; q=0.9, image/avif, image/webp, image/apng, */*; q=0.8, application/signed-exchange; v=b3; q=0.7'
无效。
这无疑是 CookieContainer 的问题,因为我向此调用添加 14 个 cookie 导致错误,而其他没有 cookie 的调用则运行良好。任何修复的更新都会很棒。谢谢你