代码之家  ›  专栏  ›  技术社区  ›  Greg Beech

使用ASP.NET MVC支持“expect:100 continue”头文件

  •  12
  • Greg Beech  · 技术社区  · 16 年前

    我正在使用ASP.NET MVC实现一个RESTAPI,并且在 Expect: 100-continue 带有日志正文的请求的请求头。

    RFC 2616 声明:

    收到请求后 包括一个Expect请求头 字段带有“100 continue”期望值,源服务器必须 以100(continue)状态响应并继续读取 从输入流,或用最终状态代码响应。这个 源服务器在发送前不得等待请求正文 100(继续)响应。如果它以最终状态响应 代码,它可以关闭传输连接或继续 读取并放弃其余请求。它不能 如果返回最终状态代码,则执行请求的方法。

    我觉得我需要 对请求的响应,即需要立即发送HTTP 100 Continue响应,然后继续从原始请求流(即 HttpContext.Request.InputStream )不结束请求,然后最终发送结果状态代码(为了参数起见,假设它是204无内容结果)。

    所以,问题是:

    1. 我是否正确地阅读了规范,即我需要对一个请求作出两个响应?
    2. 如何在ASP.NET MVC中完成此操作?

    W.R.T.(2)在继续读取输入流之前,我尝试使用以下代码…

    HttpContext.Response.StatusCode = 100;
    HttpContext.Response.Flush();
    HttpContext.Response.Clear();
    

    …但是当我尝试设置最终204状态代码时,我得到了错误:

    system.web.httpexception:发送HTTP头后,服务器无法设置状态。

    3 回复  |  直到 12 年前
        1
  •  2
  •   dso    16 年前

    100继续应由IIS处理。你想明确地这么做有什么原因吗?

        2
  •  15
  •   John Berberich    12 年前

    .NET框架默认情况下始终发送 expect: 100-continue 每个HTTP 1.1日志的标题。此行为可以通过 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 为了这个信息。

        3
  •  2
  •   SerialSeb    16 年前

    IIS处理100。

    也就是说,不,这不是两种反应。在HTTP中,当expect:100 continue作为消息头的一部分出现时,客户机应该等待直到收到响应后再发送内容。

    由于ASP.NET的架构方式,您对输出流几乎没有控制权。每当刷新时,任何写入流的数据都会自动以分块编码的方式放入200个响应中,不管您是否处于缓冲模式。

    不幸的是,所有这些东西都隐藏在内部方法中,结果是,如果您像MVC一样依赖ASP.NET,那么您几乎无法绕过它。

    等待,直到您尝试以非缓冲方式访问输入流。一大堆痛苦。

    SEB