天青云服务如何解决“ HTTP错误400。请求标头的大小太长”错误?

时间:2019-04-29 05:15:18

标签: c# load-testing azure-cloud-services

我们正在托管Azure 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>

2 个答案:

答案 0 :(得分:0)

要回答“这里出了什么问题?”这个问题并不容易。当您看到400错误时。这意味着请求本身已经以某种方式变得有缺陷。互联网协议HTTP未正确遵循(至少根据网络服务器而言),这就是无法处理请求的原因。服务器将请求解释为错误甚至有害。因此,它阻止了网站的正确显示。错误报告的原因通常与使用的浏览器或用户错误有关。

错误的URL::就像404错误一样,如果用户输入错误的Internet地址或例如输入不允许的特殊字符,则会生成错误的请求。

不正确的Cookie::如果浏览器中的Cookie过时或不正确,这是可能会发生错误400的另一个原因。 DNS记录已过期:您的DNS缓存中可能包含链接到错误IP地址的数据。

文件太大::如果您尝试上传特别大的文件,则服务器可以拒绝接受。服务器将此分类为“错误请求”。 标头太长:通信时,客户端和服务器使用标头定义请求。一些网络服务器设置标头长度的上限。 当出现错误消息“ HTTP 400 Bad Request”时,通信问题并不清楚。但是,如果目标Web服务器使用IIS 7.0,IIS 7.5或IIS 8.0,则可以从状态码获取更多详细信息:

  • 400.1:无效的目标标题
  • 400.2:无效的深度标头
  • 400.3:标头无效
  • 400.4:无效的覆盖标题
  • 400.5:翻译标题无效
  • 400.6:无效的请求正文
  • 400.7:无效的内容长度
  • 400.8:无效的超时时间
  • 400.9:无效的锁令牌

任何上述原因都可能导致错误。希望对您有所帮助。

答案 1 :(得分:0)

对我来说,我花了几天时间研究这个问题。读取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());

即使没有看到它,该客户端也是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());

由于多个征服请求可能会更新并覆盖标头,因此您仍然需要处理征服问题。

How the Header section Grew over time