Я пытаюсь вызвать операцию POST из Silverlight. Мой пост обрабатывается контроллером MVC3, который возвращает Redirect после завершения обработки данных POST. Я использую объект HttpWebRequest, и все работает нормально.
Я хочу иметь возможность отслеживать и сообщать о ходе POST во время загрузки большого файла. Я начал с реализации варианта кода здесь .
Моя проблема возникает, когда я устанавливаю 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);