none
HTTPWebRequest. RRS feed

  • Вопрос

  •  

     Пожалуйста, проверьте все ли правильно я прокомментировал в UploadFilesToRemoteUrl.

    И подскажите в каком месте собственно происходит отсылка POST-запроса?

                                                                                                                                                    public static void UploadFilesToRemoteUrl(string url, string[] files, string
    logpath, NameValueCollection nvc)
            {
                url = "http://" + url + "/";
                //Тело запроса -
                HttpWebRequest ReqLoad = (HttpWebRequest)WebRequest.Create(url);
                #region Параметры (отправщика) посылки
                long length = 0;
                string boundary = "----------------------------" +
                DateTime.Now.Ticks.ToString("x");
                ReqLoad.ContentType = "multipart/form-data; boundary=" +
                boundary;
                ReqLoad.Method = "POST";
                ReqLoad.KeepAlive = true;
                ReqLoad.Credentials =
                System.Net.CredentialCache.DefaultCredentials;
                #endregion
                //Создаём поток памяти - резервное хранилище которого является память.
                Stream memStream = new MemoryStream();
                // заголовок границы в байтах
                byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
                string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";
                //nvc - коллекция параметров для месторасположения контента ИМЯ
                foreach (string key in nvc.Keys)
                {
                    string formitem = string.Format(formdataTemplate, key, nvc[key]);
                    byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
                    memStream.Write(formitembytes, 0, formitembytes.Length);
                }
                memStream.Write(boundarybytes, 0, boundarybytes.Length);
                string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n";
                //Здесь происходит загрузка файла на отправку.
                for (int i = 0; i < files.Length; i++)
                {
                    //string header = string.Format(headerTemplate, "file" + i, files[i]);
                    //Заголовок отправляемого файла.
                    string header = string.Format(headerTemplate, "uplTheFile", files[i]);
                    //Конвертирует в байты.
                    byte[] headerbytes = Encoding.UTF8.GetBytes(header);
                    //Записывает в поток для отправки POST - сообщения.
                    memStream.Write(headerbytes, 0, headerbytes.Length);
                    //открывает и считывает в поток файл, необходимый для отправки.
                    FileStream fileStream = new FileStream(files[i], FileMode.Open,
                    FileAccess.Read);
                    byte[] buffer = new byte[1024];
                    int bytesRead = 0;
                    // пишет в поток для отправки POST - запроса
                    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        memStream.Write(buffer, 0, bytesRead);
                    }
                    // Записывает границу POST - сообщения.
                    memStream.Write(boundarybytes, 0, boundarybytes.Length);
                    //Закрываем поток файла.
                    fileStream.Close();
                }
                //Устанавливаем длину POST - запроса
                ReqLoad.ContentLength = memStream.Length;
                //Получает System.IO.Stream Объект, используемый для записи данных запроса.
                //System.IO.Stream, используемый для записи данных запроса.
                Stream requestStream = ReqLoad.GetRequestStream();

                memStream.Position = 0;
                byte[] tempBuffer = new byte[memStream.Length];
                //Считываем в tempBuffer из memStream (в нём POST-запрос) 
                memStream.Read(tempBuffer, 0, tempBuffer.Length);

                memStream.Close();
                //Записываем из tempBuffer в requestStream (в нём - POST - запрос)
                requestStream.Write(tempBuffer, 0, tempBuffer.Length);
                requestStream.Close();

                //Ждём ответ:
                //После отправки POST-запроса ждём ответ.
                WebResponse RespLoad = null;
                try
                {
                    RespLoad = ReqLoad.GetResponse();

                    Stream streamResp = RespLoad.GetResponseStream();
                    StreamReader readerResp = new StreamReader(streamResp);

                    string readerRespStr = readerResp.ReadToEnd();

                    RespLoad.Close();
                    ReqLoad = null;
                    RespLoad = null;
                }
                catch ()
                {
                   ReqLoad = null;
                    RespLoad = null;                
                }
            }

                             
    27 июля 2012 г. 10:25

Ответы

  • Отсылка пост-запроса - в строке  RespLoad = ReqLoad.GetResponse();

    Весь код с memory stream - не нужен. Данные стоит копировать вызовом fileStream.CopyTo(requestStream), без цикла с буффером. Заголовок - тоже писать прямо в requestStream.

    • Помечено в качестве ответа Sharpei Syroed 27 июля 2012 г. 10:55
    27 июля 2012 г. 10:48

Все ответы

  • Отсылка пост-запроса - в строке  RespLoad = ReqLoad.GetResponse();

    Весь код с memory stream - не нужен. Данные стоит копировать вызовом fileStream.CopyTo(requestStream), без цикла с буффером. Заголовок - тоже писать прямо в requestStream.

    • Помечено в качестве ответа Sharpei Syroed 27 июля 2012 г. 10:55
    27 июля 2012 г. 10:48
  • Отдельный вопрос лучше задавать в новой ветке.
    30 июля 2012 г. 12:11
    Модератор