如何将“已保存”的请求流转发到同一控制器中的另一个Action?

时间:2011-11-27 07:21:20

标签: asp.net-mvc

我们需要对移动设备发送的大量http请求进行分块。这些较小的块流合并到服务器上的文件中。一旦收到所有块,我们需要一种方法将保存的合并请求提交给将处理此大型http请求的同一控制器中的另一个方法(Action)。如何才能做到这一点?我们在下面尝试的代码导致服务挂起。有没有办法在没有往返的情况下这样做?

//Open merged chunked file
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

//Read steam support variables
int bytesRead = 0;
byte[] buffer = new byte[1024];

//Build New Web Request. The target Action is called "Upload", this method we are in is called "UploadChunk"
HttpWebRequest webRequest;
webRequest = (HttpWebRequest)WebRequest.Create(Request.Url.ToString().Replace("Chunk", string.Empty));
webRequest.Method = "POST";        
webRequest.ContentType = "text/xml";     
webRequest.KeepAlive = true;
webRequest.Timeout = 600000;
webRequest.ReadWriteTimeout = 600000;
webRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;

Stream webStream = webRequest.GetRequestStream();  //Hangs here, no errors, just hangs

我已经研究过使用RedirectToAction和RedirecctToRoute,但是这些方法不适合我们要做的事情,因为我们无法编辑Request.InputStream(因为它是只读的)来执行大量的请求流。 / p>

2 个答案:

答案 0 :(得分:1)

您可以构建自己想要的内容,保存在TempDataRedirectToAction中,并将其从“TempData”中删除

类似的东西:

public ActionResult DoSomething()
{
    var data = GetData();
    TempData["Data"] = data;

    RedirectToAction("Forward");
}

public ActionResult Forward()
{
    var data = TempData["data"];
    if (data == null)
        throw new ArgumentException("data is null");

    // Do your magic.

}    

答案 1 :(得分:0)

找到我要找的东西here: 需要执行以下步骤:

1)创建文件流以从文件
中读取合并的块 2)创建具有目标URI的新System.Net.HttpWebRequest 3)将标题从原始请求复制到2)中注明的新请求 4)将文件流中的内容复制到新请求中 5)将新请求的内容长度设置为文件流的长度
6)关闭文件流和新请求流
7)将标题从原始请求复制到新请求
8)将Cookies从原始请求复制到新请求

所以基本上它与编写ASP.NET东西时可以使用的逻辑相同。