使用ASP.NET MVC支持“Expect:100-continue”标头

时间:2009-05-18 18:29:08

标签: asp.net-mvc http http-headers http-status-code-100

我正在使用ASP.NET MVC实现一个REST API,并且对于有帖子正文的请求,Expect: 100-continue请求标头的形式出现了一个小绊脚石。

RFC 2616声明:

  

收到请求后   包括Expect请求标头           具有“100-continue”期望的字段,原始服务器必须           要么以100(继续)状态响应并继续阅读           来自输入流,或使用最终状态代码进行响应。该           源服务器在发送之前不得等待请求体           100(继续)回复。如果它以最终状态响应           代码,它可以关闭传输连接或它可以继续           阅读并放弃其余的请求。它绝不是           如果返回最终状态代码,则执行请求的方法。

这听起来像我需要对请求做出两个响应,即它需要立即发送HTTP 100 Continue响应,然后继续从原始请求流中读取(即{{ 1}})不结束请求,然后最终发送结果状态代码(为了参数,让我们说它是204 No Content结果)。

所以,问题是:

  1. 我是否正确地阅读了规范,我需要对请求做出两个回复?
  2. 如何在ASP.NET MVC中完成?
  3. w.r.t。 (2)在继续阅读输入流之前,我尝试使用以下代码...

    HttpContext.Request.InputStream

    ...但是当我尝试设置最终的204状态代码时,我收到错误:

      

    System.Web.HttpException:在发送HTTP标头后,服务器无法设置状态。

3 个答案:

答案 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