.net 7 HTTP 客户端调用因格式异常而失败:值“”的格式无效

Kru*_*shi 5 c# httpclient http-headers .net-7.0

我们刚刚升级到 .net 7,集成测试中的所有 http 调用都开始出现错误:

\n
Message:\xe2\x80\x89\n    System.FormatException : The format of value \'\' is invalid.\n\n  Stack Trace:\xe2\x80\x89\n    HttpHeaderParser.ParseValue(String value, Object storeValue, Int32& index)\n    HttpHeaders.ParseAndAddValue(HeaderDescriptor descriptor, HeaderStoreItemInfo info, String value)\n    HttpHeaders.Add(HeaderDescriptor descriptor, String value)\n    CookieContainerHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n    RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n    HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)\n
Run Code Online (Sandbox Code Playgroud)\n

这些测试在 .net 5 和 .net 6 中运行良好。

\n

这是一个测试示例 -

\n
public async Task ShouldGetStatusOfRunFromAPI()\n{\n            var client = CreateClient(this.mockApiServer.Uri.ToString());\n\n            HttpResponseMessage response = await client.GetAsync(StatusAPIForAuroraRun1ContextPath);\n\n            Assert.Equal(HttpStatusCode.OK, response.StatusCode);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我没有明确设置任何标头,但错误并没有明确指出它期望哪个值不能为空。

\n

这是 TestStartup 中的 CreateClient 方法 -

\n
protected HttpClient CreateClient(string uri)\n        {\n            var projectDir = Directory.GetCurrentDirectory();\n            var factory = new WebApplicationFactory<Program>();\n            var config = TestConfigurationHelper.LoadConfiguration();\n\n            return factory\n                .WithWebHostBuilder(builder =>\n                {\n                    builder.ConfigureTestServices(services =>\n                    {\n                        services.Configure<ClassOptions>(options => config.GetSection(ClassOptions.Name).Bind(options));\n\n                        SomeService someService = NewService(config);\n                        services.AddSingleton(someService);\n\n                        Kubernetes kubernetesClient = NewKubernetesClient(uri);\n                        services.AddSingleton<IKubernetes, Kubernetes>((svcProvider) => kubernetesClient);\n\n                        services.AddSingleton<ISecretProvider, SecretProvider>((svcProvider) => NewSecretProvider());\n\n                    })\n                    .ConfigureAppConfiguration((context, builder) =>\n                    {\n                        builder.AddConfiguration(config);\n                    });\n                })\n                .CreateClient();\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

错误消息显示添加一些标头时失败,但我如何知道哪个标头值失败?\nAccept 的值已设置,我还尝试使用 - 显式设置它

\n
client.DefaultRequestHeaders.Accept.Clear();\nclient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));\n
Run Code Online (Sandbox Code Playgroud)\n

但这也因同样的错误而失败。

\n

调用 GetAsync() 的行失败。\n这些是调用时的标头值 -\n在此输入图像描述

\n

Joh*_*ohn 7

根据我对这个问题的评论,这是一个问题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" />
Run Code Online (Sandbox Code Playgroud)