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

Gre*_*ech 13 asp.net-mvc http http-headers http-status-code-100

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

RFC 2616声明:

在收到包含具有"100-continue"期望的Expect请求标题字段的请求时,源服务器必须以100(继续)状态响应并继续从输入流中读取,或者以最终状态代码进行响应.在发送100(继续)响应之前,源服务器不得等待请求主体.如果它以最终状态代码响应,它可以关闭传输连接,或者它可以继续读取并丢弃请求的其余部分.如果它返回最终状态代码,则它不能执行所请求的方法.

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

所以,问题是:

  1. 我是否正确地阅读了规范,我需要对请求做出两个回复?
  2. 如何在ASP.NET MVC中完成?

wrt(2)我在继续阅读输入流之前尝试使用以下代码...

HttpContext.Response.StatusCode = 100;
HttpContext.Response.Flush();
HttpContext.Response.Clear();
Run Code Online (Sandbox Code Playgroud)

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

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

Joh*_*ich 16

默认情况下,.NET框架始终expect: 100-continue为每个HTTP 1.1帖子发送标头.可以通过System.Net.ServicePoint.Expect100Continue属性以编程方式控制此行为,如下所示:

HttpWebRequest httpReq = GetHttpWebRequestForPost();
httpReq.ServicePoint.Expect100Continue = false;
Run Code Online (Sandbox Code Playgroud)

它也可以通过编程方式进行全局控制:

System.Net.ServicePointManager.Expect100Continue = false;
Run Code Online (Sandbox Code Playgroud)

......或通过配置全局:

<system.net>
  <settings>
    <servicePointManager expect100Continue="false"/>
  </settings>
</system.net>
Run Code Online (Sandbox Code Playgroud)

感谢Lance Olson和Phil Haack提供此信息.


DSO*_*DSO 2

100-继续应该由 IIS 处理。您想要明确执行此操作是否有原因?