Как отправить POST запрос с мультипраметрами на C#?

Здравствуйте, коллеги!

Пытаюсь сформировать POST запрос по указанному адресу: https:// int223.zakupki.gov.ru/223/integration/integration/upload

Но каждый раз когда пытаюсь получить ответ, сервер возвращает 404.

В регламенте описан пример:

Пример POST-запроса (в скобках указаны переменные значения):
POST /223/integration/integration/upload HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------7db10b11c0824
Host: int223.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



Вот исходник:

X509Store certStore = new X509Store(StoreLocation.CurrentUser);
            certStore.Open(OpenFlags.ReadOnly);
            var cert = certStore.Certificates.Find(X509FindType.FindBySubjectName, "MyCompanySSL", false)[0];
            
            byte[] fileData = File.ReadAllBytes(@"D:\test.xml");

            const string url = "https://int223.zakupki.gov.ru/223/integration/integration/upload";
            string boundary = $"-----------------------------{DateTime.Now.Ticks.ToString("x")}";
            byte[] data;

            using (Stream formDataStream = new MemoryStream())
            {
                string login = $"{boundary}\r\nContent-Disposition: form-data; name=\"login\"\r\n\r\n{"MyLogin"}";
                formDataStream.Write(Encoding.ASCII.GetBytes(login), 0, Encoding.ASCII.GetBytes(login).Length);
                
                string password = $"{boundary}\r\nContent-Disposition: form-data; name=\"password\"\r\n\r\n{"MyPassword"}";
                formDataStream.Write(Encoding.ASCII.GetBytes(password), 0, Encoding.ASCII.GetBytes(password).Length);
                
                string fileHeader = $"{boundary}\r\nContent-Disposition: form-data; name=\"{"document"}\"; filename=\"{"test.xml"}\"\r\nContent-Type: text/xml\r\n\r\n";
                formDataStream.Write(Encoding.ASCII.GetBytes(fileHeader), 0, Encoding.ASCII.GetBytes(fileHeader).Length);
                formDataStream.Write(fileData, 0, fileData.Length);
                string fileFooter = "\r\n" + boundary + "\r\n";
                formDataStream.Write(Encoding.ASCII.GetBytes(fileFooter), 0, Encoding.ASCII.GetByteCount(fileFooter));
                
                formDataStream.Position = 0;
                data = new byte[formDataStream.Length];
                formDataStream.Read(data, 0, data.Length);
            }
            
            WebRequest request = WebRequest.Create(url);

            ((HttpWebRequest)request).ClientCertificates.Add(cert);
            ((HttpWebRequest)request).CachePolicy= new System.Net.Cache.HttpRequestCachePolicy(System.Net.Cache.HttpRequestCacheLevel.NoCacheNoStore);

            request.Method = "POST";
            request.ContentType = $"multipart/form-data; boundary={boundary}";
            request.ContentLength = data.Length;
            
            using (Stream requestStream = request.GetRequestStream())
            {
                requestStream.Write(data, 0, data.Length);
                requestStream.Close();
            }
            
            var response = request.GetResponse() as HttpWebResponse;


На GetResponse() постоянно вываливается 404. Не могу понять что не так?
  • Вопрос задан
  • 2365 просмотров
Решения вопроса 1
FavoritMVS
@FavoritMVS Автор вопроса
Спасибо всем за участие. Проблема решена. Дело было в количестве "-", в заголовке запроса boundary должно содержаться на 2 "--" меньше чем в параметрах запроса...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Splo1ter
@Splo1ter
.NET Developer (9 years+)
Какой то изврат у вас =)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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