我正在使用ASP.NET MVC实现一个REST API,并且对于有帖子正文的请求,Expect: 100-continue
请求标头的形式出现了一个小绊脚石。
RFC 2616声明:
收到请求后 包括Expect请求标头 具有“100-continue”期望的字段,原始服务器必须 要么以100(继续)状态响应并继续阅读 来自输入流,或使用最终状态代码进行响应。该 源服务器在发送之前不得等待请求体 100(继续)回复。如果它以最终状态响应 代码,它可以关闭传输连接或它可以继续 阅读并放弃其余的请求。它绝不是 如果返回最终状态代码,则执行请求的方法。
这听起来像我需要对请求做出两个响应,即它需要立即发送HTTP 100 Continue响应,然后继续从原始请求流中读取(即{{ 1}})不结束请求,然后最终发送结果状态代码(为了参数,让我们说它是204 No Content结果)。
所以,问题是:
w.r.t。 (2)在继续阅读输入流之前,我尝试使用以下代码...
HttpContext.Request.InputStream
...但是当我尝试设置最终的204状态代码时,我收到错误:
System.Web.HttpException:在发送HTTP标头后,服务器无法设置状态。
答案 0 :(得分:15)
默认情况下,.NET框架始终为每个HTTP 1.1帖子发送expect: 100-continue
标头。可以通过System.Net.ServicePoint.Expect100Continue
属性按请求以编程方式控制此行为,如下所示:
HttpWebRequest httpReq = GetHttpWebRequestForPost();
httpReq.ServicePoint.Expect100Continue = false;
它也可以通过编程方式进行全局控制:
System.Net.ServicePointManager.Expect100Continue = false;
......或通过配置全局:
<system.net>
<settings>
<servicePointManager expect100Continue="false"/>
</settings>
</system.net>
感谢Lance Olson和Phil Haack提供此信息。
答案 1 :(得分:2)
100-continue应由IIS处理。是否有理由明确要这样做?
答案 2 :(得分:2)
IIS处理100。
那就是说,不,不是两个回应。在HTTP中,当Expect:100-continue作为消息头的一部分进入时,客户端应该等待,直到它在发送内容之前收到响应。
由于asp.net的架构方式,您几乎无法控制输出流。无论何时刷新,任何写入流的数据都会自动放入带有分块编码的200响应中,无论您是否处于缓冲模式。
可悲的是,所有这些东西都隐藏在整个地方的内部方法中,结果是如果你依赖asp.net,就像MVC一样,你几乎无法绕过它。
等到您尝试以非缓冲方式访问输入流。一大堆痛苦。
的Seb