POST с использованием обратного вызова HttpWebRequest не запускается, когда ответ от POST является перенаправлением - PullRequest
2 голосов
/ 28 мая 2011

Я пытаюсь вызвать операцию 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);

1 Ответ

1 голос
/ 30 мая 2011

По умолчанию класс HttpWebRequest автоматически выполняет любые перенаправления. Я собираюсь подозревать , что это вызывает проблему.

Чтобы обойти это, установите httpWebRequest.AllowAutoRedirect на false. По умолчанию true.

Как только ответ будет возвращен, вы будете нести ответственность за проверку того, является ли код состояния 301, 302, 303 или 307, получение значения заголовка Location и последующее выполнение перенаправления самостоятельно. В случае Silverlight перенаправление, скорее всего, будет коррелировать с навигацией на уровне страницы, поэтому об этом вам в любом случае придется позаботиться вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...