none
проблема посылки больших файлов по HTTP RRS feed

  • Вопрос

  • Добрый день
    Есть такая задача отправить файл (не multipart/form-data) а просто как POST данные.

    Соответственно сделал цикл в котором считываю данные из файла в память и сразу отправляю эти данные на сервер

    вот код

    publc string SendPostRequest(string url, string filepath, int buflen = 1024 * 1024 * 100)
    {
       byte[] buf = new byte[buflen];
       Stream to = null;
       HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(url);
       FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
       FileInfo fi = new FileInfo(filepath);
       hwr.Method = "POST";
       hwr.AllowWriteStreamBuffering = false;
       hwr.ContentType = "application/json";
       hwr.ContentLength = fi.Length;
       to = hwr.GetRequestStream();
       for (; ; d++)
       {
          readed = fs.Read(buf, 0, buf.Length);
          if (readed == 0) break;
          to.Write(buf, 0, readed);
       }
       fs.Close();
    }
    И тут на третьей итерации выскакивает исключение:
    "The stream does not support concurrent IO read or write operations."

    Очень странно, как видно тут функция Write говорит что идет одновременно и чтение и запись в поток

    но по коду видно что один поток это fs а второй to

    В чем может быть косяк?


    22 декабря 2019 г. 13:52

Ответы

  • Получилось вот что

    WebClient wc = new WebClient();
    wc.Headers.Add("Content-Type", "application/json");
    using (Stream s1 = File.OpenRead(filepath))
    {
      using (Stream s2 = wc.OpenWrite(url, "POST"))
      {
        s1.CopyTo(s2,1024*1024*10);
      }
    }

    тут используется метод CopyTo() и все работает

    Однако, остается не понятным почему предыдущий код не работает.

    23 декабря 2019 г. 14:43

Все ответы

  • Здравствуйте,

    Видимо код пытается получить доступ к стриму to, пока он все еще используется. Посмотрите ответ здесь, может будет полезен: The stream does not support concurrent IO read or write operations.


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.

    23 декабря 2019 г. 9:02
    Модератор
  • да, мне тоже кажется, что ктото еще обращается к to

    но почему на третей итерации, плюс, по коду ведь видно что никто параллельно к to не обращается

    все это странно.....

    может еще есть идеи у кого нибудь?

    23 декабря 2019 г. 13:35
  • Получилось вот что

    WebClient wc = new WebClient();
    wc.Headers.Add("Content-Type", "application/json");
    using (Stream s1 = File.OpenRead(filepath))
    {
      using (Stream s2 = wc.OpenWrite(url, "POST"))
      {
        s1.CopyTo(s2,1024*1024*10);
      }
    }

    тут используется метод CopyTo() и все работает

    Однако, остается не понятным почему предыдущий код не работает.

    23 декабря 2019 г. 14:43
  • Получилось вот что

    WebClient wc = new WebClient();
    wc.Headers.Add("Content-Type", "application/json");
    using (Stream s1 = File.OpenRead(filepath))
    {
      using (Stream s2 = wc.OpenWrite(url, "POST"))
      {
        s1.CopyTo(s2,1024*1024*10);
      }
    }

    тут используется метод CopyTo() и все работает

    Однако, остается не понятным почему предыдущий код не работает.

    Если вам интересно, то посмотрите исходный код CopyTo() и сравните с вашим:

    https://github.com/microsoft/referencesource/blob/master/mscorlib/system/io/stream.cs


    This posting is provided "AS IS" with no warranties, and confers no rights.

    23 декабря 2019 г. 19:40
    Модератор