【问题标题】:how to forward a request with original headers intact如何转发原始标头完整的请求
【发布时间】:2011-09-06 19:01:13
【问题描述】:

我正在尝试编写一个 ASP.NET http 处理程序,其目的如下: 在收到请求时,检查参数,在数据库中查找 URL,记录请求,如果一切正常,则转发请求(或在响应中返回文件)。

这几乎是直截了当的。问题是该请求是部分 http 请求(它包含一个范围标头),并且客户端期望部分响应。我尝试使用 server.transfer 将请求传输到正确的文件。像这样的:

public class Redirecter : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        //Check stuff
        ............
        if( everyThingOk )
        {
             context.Server.Transfer("/Temp/the/file");
        }
        else
        {
            //respond with some error
        }
    }
    ........
}

问题是传输似乎不尊重原始请求标头。我没有为我将请求重定向到的 URL 安装任何处理程序或任何东西,所以我只希望它是一个正常的文件下载。 但由于原始请求包含 Range 标头,我希望响应是部分响应,但它不是

请求:

GET /Some/file HTTP/1.1
Range:bytes=0-4999               <----only want 5000 bytes

回复:

HTTP/1.1 200 OK          <-------- what? Expected 206!
Server:ASP.NET Development Server/10.0.0.
Date:Tue, 06 Sep 2011 09:21:07 GMT
X-AspNet-Version:4.0.30319
Cache-Control:private
Content-Type:text/html
Content-Length:79051  <----- too large, only expected 5000 bytes max
Connection:Close

而且我也缺少 Content-Range 标头。所以好像在传输中丢失了一个标头?

我不需要进行转移,这是我认为最简单的方法。

如何正确地进行“转移”以尊重部分请求?

【问题讨论】:

  • 请不要在标题前加上“ASP.NET”。在Stack Overflow 上,我们为此目的使用标签。

标签: c# asp.net iis-7


【解决方案1】:

为什么不直接调用 Asp.Net 请求处理程序?是HttpApplication吗?

【讨论】:

  • 不知道该怎么做?你能举个例子吗,我对这个东西很陌生;)我编辑了这篇文章,希望能澄清我在做什么。
  • 想法是直接调用应该调用的任何IHttpHandler实现(获取httpHanlder实例并调用ProicessRequest方法)
  • 我应该调用哪个处理程序?我已经在处理程序中,我已经接受了请求,我只需要一些方法来下载部分文件。有没有一些FileRequestHandler,或者?
【解决方案2】:

您可能想从请求中读取这些标头;与他们建立一个 Web 请求; 例如:

            HttpWebRequest httpWebRequest = HttpWebRequest.Create("absolutepath") as HttpWebRequest;
            httpWebRequest.Headers["Content_Length"] = this.Request.ServerVariables["Content_Length"];
            httpWebRequest.Headers["Content_Range"] = this.Request.ServerVariables["Content_Range"];

            // Create expects absolute path..
            // you might have to build an absolute path location for the temp file
            HttpWebResponse response =  httpWebRequest.GetResponse() as HttpWebResponse; 

【讨论】:

  • 嗯。我知道我可以通过提取标题、打开文件并仅将所需内容发送回客户端来以完全手动的方式执行此操作。只是我认为我想做的事情是如此简单,以至于它可以用 ASP.NET 在一行或其他东西中完成。我不明白为什么“转移方法”不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2011-06-26
  • 2012-02-09
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
相关资源
最近更新 更多