@DarkSpirit22
Microsoft Dynamics AX Developer

Как отправить POST запрос (HTTPS с использованием TLS) (на сайт гос закупок)?

Приветствую.
Мне поставили задачу по автоматической выгрузке xml на сайт гос закупок. Выгрузка осуществляется путем отправки POST запроса на веб службу гос. закупок. Проблема в том, что веб программированием никогда не занимался, и в попытке разобраться, получаю не работающую программу :(
В документации сказано:

Передача информации осуществляется по защищенным телекоммуникационным каналам связи по специализированному адресу (https://zakupki.gov.ru/pgz/services/upload) открытой части ООС по протоколу HTTPS. При этом используется криптографический протокол TLS (аутентификация клиента не требуется).


Пример POST-запроса (в скобках указаны переменные значения):
POST /pgz/services/upload HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------7db10b11c0824
Host: zakupki.gov.ru
Content-Length: (размер содержимого)
Connection: Keep-Alive
Cache-Control: no-cache

-----------------------------7db10b11c0824
Content-Disposition: form-data; name="login"

(имя пользователя)
-----------------------------7db10b11c0824
Content-Disposition: form-data; name="password"

(пароль)
-----------------------------7db10b11c0824
Content-Disposition: form-data; name="document"; filename="(имя файла)"
Content-Type: text/xml

(XML-документ)
-----------------------------7db10b11c0824

Хорошо, на основе всего этого, и всемогущего гугла, накатал небольшое консольное приложения для теста:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;

namespace MicrosoftWebRequestSample
{
    class Program
    {
        public static string boundary;

        static void Main(string[] args)
        {
            string boundary = "--AE337F6ACF9E45A4895CB7DB4372F700";
            StringBuilder sb = new StringBuilder();

            sb.Append(String.Format("{0}\r\nContent-Disposition: form-data; name=\"login\"\r\n\r\n{1}",
                            boundary,
                            "MyLogin"));

            sb.Append(String.Format("\r\n{0}\r\nContent-Disposition: form-data; name=\"password\"\r\n\r\n{1}",
                                    boundary,
                                    "MyPassword"));

            sb.Append(String.Format("\r\n{0}\r\nContent-Disposition: form-data; name=\"document\"; filename=\"{1}{2}\"\r\n\r\n{3}",
                                    boundary,
                                    "tenderPlanChange_ПГ2015_2015-09-29_1",
                                    ".xml",
                                    "Telo XML"));

            sb.Append(String.Format("\r\n{0}--\r\n", boundary));

            sendRequest(sb.ToString());
            Console.ReadKey();
        }

        static void sendRequest(string postData)
        {
            System.Net.HttpWebRequest webRequest;
            System.Net.HttpWebResponse httpWebResponse;
            System.IO.Stream stream;
            System.IO.StreamReader streamReader;
            System.Byte[] byteArray;
            System.Text.Encoding encodingUTF8;

            string statusDescription;
            string responseFromServer;
            Uri uri = new Uri("https://zakupki.gov.ru/pgz/services/upload");
            //Uri uri = new Uri("http://httpbin.org/post");

            try
            {              
                //1. Создать запрос.
                webRequest = (HttpWebRequest)WebRequest.Create(uri);
                webRequest.Method = "POST";
                webRequest.ProtocolVersion = HttpVersion.Version10;
                webRequest.KeepAlive = false;
                System.Net.Cache.RequestCachePolicy cashePol = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);
                webRequest.CachePolicy = cashePol;

                //2. Ввести данные к отправке и ковертировать их в массив байтов
                encodingUTF8 = System.Text.Encoding.UTF8;
                byteArray = encodingUTF8.GetBytes(postData);

                //3. Изменить свойства запроса: ContentType, ContentLength.
                webRequest.ContentType = "multipart/form-data; boundary=" + Program.boundary;
                //webRequest.ContentType = "text/xml";
                webRequest.ContentLength = byteArray.Length;

                Console.WriteLine("Request: \n {0}", postData);
                Console.ReadKey();

                //4. Если требуется авторизация, то указать учетные данные.
                //credentialCache = System.Net.CredentialCache.DefaultCredentials;

                ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback((s, ce, ch, ssl) => true);

                //5. Получить поток с данными.
                stream = webRequest.GetRequestStream();

                //6. Записать поток данных.
                stream.Write(byteArray, 0, byteArray.Length);

                //7. Закрыть поток.
                stream.Close();

                //8. Получить ответ.
                httpWebResponse = (System.Net.HttpWebResponse)webRequest.GetResponse();

                //9. Отобразить статус.
                statusDescription = httpWebResponse.StatusDescription;
                Console.WriteLine("{0}", statusDescription);

                //10. Получить поток с данными.
                stream = httpWebResponse.GetResponseStream();

                //11. Открыть поток с помощью StreamReader.
                streamReader = new System.IO.StreamReader(stream);

                //12. Прочитать содержимое.
                responseFromServer = streamReader.ReadToEnd();

                //13. Вывести содержимое в инфолог.
                Console.WriteLine("{0}", responseFromServer);

                //14. Закрыть все.
                streamReader.Close();
                stream.Close();
                httpWebResponse.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Ошибка");
                Console.WriteLine(ex.Message);
            }
        }
    }
}


Но вот, постоянно получаю ошибку:
Запрос был прерван: Не удалось создать защищенный канал SSL/TLS.


Помогите, пожалуйста :)
  • Вопрос задан
  • 8543 просмотра
Решения вопроса 1
@DarkSpirit22 Автор вопроса
Microsoft Dynamics AX Developer
Решил проблему, надо было установить корневой сертификат УЦ Казначейства и КриптоПРО.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
littleguga
@littleguga
Не стыдно не знать, а стыдно не интересоваться.
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы