为什么大型POST请求无法访问我的Azure Web角色?

时间:2013-07-29 14:03:50

标签: iis azure azure-web-roles

在我的Azure Web角色中,处理大于大约3000万字节的POST请求有问题。我知道有一个IIS过滤器可以检测超过3000万字节的所有请求,并将结果设置为404.但我希望这些404代码会显示在IIS日志中。

我的网络角色的用户面临以下行为:对我的网络角色中特定网址的POST请求小于大约3000万字节就可以了(我在IIS日志中看到它们)但POST请求更大比那个(到同一个URL)产生客户端的HTTP 503(服务不可用)代码,我在IIS日志中看不到这些请求。

以下是长POST样本的标题

POST /mySpecificUrl?paramshere HTTP/1.1
User-Agent: Custom USer Agent
Content-Type: application/octet-stream
Proxy-Authorization: NTLM LongBase64StringHere
Host: my.hostname.here
Content-Length: content length here - about 32 megabytes
Expect: 100-continue

看起来某些东西正在拦截这些请求 - 可能是负载均衡器或其他东西,所以他们没有达到我的角色。

现在用户使用了Fiddler,他声称当他获得代码503时,会返回以下内容:

Hello,
A communication error occurred: ""
The Web Server may be down, too busy, or experiencing other
problems preventing it from responding to requests.
You may wish to try again at a later time.

以HTML格式制作。与此内容一起出现的标头不包含我们在每个响应中注入的自定义标头,因此它是另一个证据表明请求未到达IIS。

如何找出导致此行为的原因以及如何控制此行为(例如,更改请求大小阈值)?

2 个答案:

答案 0 :(得分:1)

我完全相信阻止请求到达IIS的内容。可能是防火墙规则或Load Balancer,这就是您无法在IIS中看到日志的原因。坏消息是,我找不到告诉你发布大量内容的方法。

尝试将此配置应用于“ServiceDefinition.csdef”文件,看看它是否有用:

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="WindowsAzure1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2013-03.2.0">
  <LoadBalancerProbes>
    <LoadBalancerProbe protocol="http" name="config" timeoutInSeconds="36000"></LoadBalancerProbe>
  </LoadBalancerProbes>
  <WebRole name="webRoleConfig">
    <Runtime executionContext="elevated"></Runtime>
  </WebRole>  
</ServiceDefinition>

答案 1 :(得分:0)

在调查和支持请求付出了很多努力之后,结论是Azure之外的某些软件可能会发送该消息,也许某些代理服务器或其他东西。

我们的服务配置为<system.webServer><security><requestFiltering><requestLimits maxAllowedContentLength 不匹配 <system.web><httpRuntime maxRequestLength>this is known to cause IIS return HTTP 500 and close the connection for requests with lengths in certain range。这只是猜测,但也许其他软件会拦截HTTP 500响应并发出“Hello”消息。

我要求this question on ServerFault找出已发出此消息的软件。