当POST的响应是重定向时,不会触发使用HttpWebRequest回调的POST

时间:2011-05-28 14:45:15

标签: asp.net-mvc silverlight http httpwebrequest

我正在尝试从Silverlight调用POST操作。我的帖子由MVC3控制器处理,MVC3控制器在完成处理POST数据后返回Redirect。我使用HttpWebRequest对象,一切正常。

我希望能够在上传大文件时监控并报告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);

1 个答案:

答案 0 :(得分:1)

默认情况下,HttpWebRequest类会自动跟踪任何重定向。我将怀疑这导致了这个问题。

要解决此问题,请将httpWebRequest.AllowAutoRedirect设置为false。默认值为true

一旦返回响应,您将负责检查状态代码是否为301,302,303或307,检索Location标头的值,然后自己执行重定向。对于Silverlight,重定向很可能与页面级别导航相关,因此无论如何这都需要您手动处理。