我正在尝试编写一个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标题。所以在传输过程中似乎丢失了标题?
我不需要进行转移,这正是我认为最简单的方法。
如何正确进行“转移”,以便尊重部分请求?
答案 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;