2011-05-28 63 views
2

我想从Silverlight调用POST操作。我的文章是由一个MVC3控制器处理的,该控制器在完成处理POST数据后返回一个重定向。我使用HttpWebRequest对象,一切正常。POST使用HttpWebRequest回调不会触发POST时的响应是重定向

我希望能够在上载大文件时监视和报告POST的进度。我已经开始实施代码here的变体。

我将request.AllowWriteStreamBuffering设置为false时发生问题。我的异步回调方法从未被解雇。

如果我将POST处理程序更改为不返回重定向,则所有事情都按预期工作。

有没有人有任何想法如何解决这个问题?

这里是我的代码

var request = (HttpWebRequest) WebRequestCreator.ClientHttp.Create(new 
Uri("http://localhost:3399/items/upload")); 

request.Method = "POST"; 
string boundary = "---------------" + DateTime.Now.Ticks; 
request.ContentType = "multipart/form-data; boundary=" + boundary; 

request.AllowWriteStreamBuffering = false; 

request.ContentLength = CalculatePostLength(); 

request.BeginGetRequestStream(asyncResult => 
{ 
    Stream stream = request.EndGetRequestStream(asyncResult); 
    var writer = new StreamWriter(stream); 

    //Write filename 
    writer.WriteLine(boundarySeparator); 
    writer.WriteLine(nameheader); 
    writer.WriteLine(); 
    writer.WriteLine(title); 

    //Write file 
    writer.WriteLine(boundarySeparator); 
    writer.WriteLine(fileHeader); 
    writer.WriteLine(contentType); 
    writer.WriteLine(contentLength); 
    writer.WriteLine(); 
    writer.Flush(); 
    Stream output = writer.BaseStream; 
    Stream input = fileToUpload.OpenRead(); 
    var buffer = new byte[4096]; 
    for (int size = input.Read(buffer, 0, buffer.Length); 
     size > 0; 
     size = input.Read(buffer, 0, buffer.Length)) 
    { 
     output.Write(buffer, 0, size); 
    } 
    output.Flush(); 
    writer.WriteLine(); 

    writer.WriteLine(boundaryCompleter); 
    writer.Flush();              

    stream.Close(); 
    request.BeginGetResponse(ReadHttpResponseCallback, request); 


}, request); 
+0

您是否尝试过使用浏览器HTTP堆栈而不是客户端堆栈?在SL4中有一个开放的bug。 – jv42 2011-11-03 13:47:08

回答

1

默认情况下,HttpWebRequest类将自动跟随任何重定向。我要嫌疑人,这是造成这个问题。

要避开它,请将httpWebRequest.AllowAutoRedirect设置为false。缺省值是true

一旦返回响应,您将负责检查状态码是301,302,303还是307,检索Location标头的值,然后自己执行重定向。就Silverlight而言,重定向很可能与页面级导航相关,所以这是您无论如何都需要手动处理的东西。

+0

感谢您的回答,这很好,只是不适用于Silverlight。我可能应该在我的问题中指出我已经走上了这条道路。问题是AllowAutoRedirect在Silverlight中未实现;所以将其设置为false只需引发NotImplementedException。 – JTango18 2011-05-29 23:56:46

+0

我甚至检查了MSDN文档以查看该成员已定义。 :( 唉*动摇拳头在Silverlight中是无用* – 2011-05-30 00:19:03

+1

魔鬼在:-) 平台说明 Silverlight 4的细节: - 针对Silverlight 4时,不要使用此成员。 – JTango18 2011-05-30 00:24:31