如何修复来自 Azure 云服务的“HTTP 错误 400。请求标头的大小太长”错误?

Rag*_*V V 3 c# load-testing azure-cloud-services

我们正在对托管 Web API 的 Azure 云服务进行负载/性能测试。在一定数量的调用(比如 500 次)之后,云服务给出了错误的请求错误。

我们使用 web 角色在 c# 中构建了 web API,并将它们托管在 Azure 云服务中。我浏览了几篇文章/论坛,并尝试了以下几个选项: 1. 尝试增加云服务 VM 实例大小。2. 尝试将 'maxAllowedContentLength' 值增加到 52428800。 3. 尝试将 'maxRequestLength' 值从 5120 增加到 16240。 4. 使用 VS 诊断工具检查问题是否是由于内存泄漏。他们都没有工作。

在击中端点约 450 - 500 次后,此错误仅来自涉及与子系统通信的端点。此错误在本地不可重现。要解决这个问题,要么重新部署云服务,要么重启云服务。理想情况下,云服务应该一直工作到它的资源消耗达到 100%。但是每大约 500 次调用后就会出现错误,最大资源利用率为 10 - 15%。

<HTML>
<HEAD>
<TITLE>Bad Request</TITLE> 
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii">
</HEAD> 
<BODY>
<h2>Bad Request - Request Too Long</h2> 
<hr><p>HTTP Error 400. The size of the request headers is too long.</p> 
</BODY>
</HTML>
Run Code Online (Sandbox Code Playgroud)

Pra*_*hra 5

对我来说,我花了几天时间研究这个问题。读取 blob 和解决方案,清除缓存,将标头大小的最大限制设置为更大的数字,没有任何效果。最终它会失败。

如果我重新部署我的应用程序,则不会发生此问题,但一段时间后,这会开始出现,这让我意识到它可能会添加到内存中。

我正在从我的项目中调用另一个 API,我们在其中创建请求并发送它并获取数据。

 public async Task<DataList> GeDataList()
        {
            Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await _tokenProvider.GetBearerToken());

            Client.DefaultRequestHeaders.Add("X-CorrelationId", Guid.NewGuid().ToString());

            var requestMessage = new HttpRequestMessage()
            {
                Method = HttpMethod.Post,
                RequestUri = new Uri($"{Config.apiurl}{string.Format(Config.id, id2 == null ? id1 : id2)}")
            };
            requestMessage.Headers.Add(Constants.TRACE_HEADER, "true");
            requestMessage.Headers.Add(Constants.SUBSCRIPTION_KEY_HEADER, Config.APIKey);
            requestMessage.Content = new StringContent(JsonConvert.SerializeObject(requestdata), null, "application/json");
 ...................................
 ...................................
 ................................... 
}
Run Code Online (Sandbox Code Playgroud)

现在这是罪魁祸首 Key

 Client.DefaultRequestHeaders.Add("X-CorrelationId", Guid.NewGuid().ToString());
Run Code Online (Sandbox Code Playgroud)

甚至没有看到它,这个Client就是HttpClient的一个类Level变量。创建 HttpClient 的单个实例是可以的,但您必须意识到

.Add Header 方法,总是附加到一个键并且不会覆盖。许多人认为它是关键值。它实际上是关键和一系列值。因此,每个请求都会继续将相关 ID 作为新对象添加到数组中。最终这变成了大量的标题

修复:您可以先清除密钥

if(Client.DefaultRequestHeaders.Contains("X-CorrelationId")) {
    Client.DefaultRequestHeaders.Remove("X-CorrelationId");
}
Client.DefaultRequestHeaders.Add("X-CorrelationId", Guid.NewGuid().ToString());
Run Code Online (Sandbox Code Playgroud)

您仍然需要处理征服问题,因为多个征服请求可能会更新和覆盖您的标头。

标题部分如何随着时间的推移而增长