Приветствую.
Мне поставили задачу по автоматической выгрузке 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.
Помогите, пожалуйста :)