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

问题描述 投票:0回答:3

我们刚刚升级到 .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"));

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

调用 GetAsync() 的行失败。 这些是调用时的标头值 -

c# http-headers httpclient .net-7.0
3个回答
6
投票

根据我对这个问题的评论,这是

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" />

2
投票

这是“CookieContainerHandler”中的问题。请升级您的“Microsoft.AspNetCore.MVC.Testing”。


0
投票

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 的调用则运行良好。任何修复的更新都会很棒。谢谢你

© www.soinside.com 2019 - 2024. All rights reserved.