我正在尝试从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);
答案 0 :(得分:1)
默认情况下,HttpWebRequest
类会自动跟踪任何重定向。我将怀疑这导致了这个问题。
要解决此问题,请将httpWebRequest.AllowAutoRedirect
设置为false
。默认值为true
。
一旦返回响应,您将负责检查状态代码是否为301,302,303或307,检索Location
标头的值,然后自己执行重定向。对于Silverlight,重定向很可能与页面级别导航相关,因此无论如何这都需要您手动处理。