如何转发原始标头完整的请求

时间:2011-09-06 09:27:25

标签: c# asp.net iis-7

我正在尝试编写一个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标头,我希望响应是部分respnse,但它不是

请求:

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标题。所以在传输过程中似乎丢失了标题?

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可能希望从请求中读取这些标头;与他们一起构建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;