c# - 如何修复来自 Azure 云服务的“HTTP 错误 400。请求标头的大小太长”错误?
问题描述
我们正在托管 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>
解决方案
对我来说,我花了几天时间研究这个问题。读取 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");
...................................
...................................
...................................
}
现在这是罪魁祸首
Client.DefaultRequestHeaders.Add("X-CorrelationId", Guid.NewGuid().ToString());
看不出来,这个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());
您仍然需要处理征服问题,因为多个征服请求可能会更新并覆盖您的标头。
推荐阅读
- tensorflow - GCloud MLEngine:创建版本失败。检测到错误模型错误:加载模型失败:需要类似字节的对象,而不是“str”(错误代码:0)
- scala - 使用临时凭证通过来自 AWS 外部的 spark 从 s3 读取
- python - 我如何获得为单个图像预测的神经网络的值?
- docker - 我的 docker 应用程序构建在 azure devops 中失败
- sql - 为什么 DateAdd() 和 DATEDIFF() 给出不同的结果并且性能更好?
- excel - 如何在单个单元格中使用等于和多个 Vlookup
- python - 如何导入“psutil”
- java - 无法在linux机器上编译java程序
- mysql - 索引中的漏洞是否会以某种方式影响数据库?
- python - 在 python 中使用 dateutil 解析时间时信息丢失