Kru*_*shi 5 c# httpclient http-headers .net-7.0
我们刚刚升级到 .net 7,集成测试中的所有 http 调用都开始出现错误:
\nMessage:\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这是一个测试示例 -
\npublic 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 方法 -
\nprotected 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 的值已设置,我还尝试使用 - 显式设置它
\nclient.DefaultRequestHeaders.Accept.Clear();\nclient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));\n
Run Code Online (Sandbox Code Playgroud)\n但这也因同样的错误而失败。
\n\n根据我对这个问题的评论,这是一个问题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)