Первоначально я использовал WebRequest и WebResponse для отправки сообщений Http Post. Всегда получал ответ «ОК». Сообщение, которое я публикую, представляет собой XML, подписанный сертификатом в XML.
Состав такой:
C # сервис, который отправляет на сайт https.
HTTPS Сайт в другом месте, что я не могу сказать.
Локальный веб-сайт HTTPS, который просто получает сообщения, которые я отправляю локально, и записывает результаты в файл. Просто чтобы смоделировать то, что получает другой сайт.
Локальный веб-сайт подписан самозаверяющим сертификатом, срок действия которого истекает в 2048 году.
Этот код работал нормально до этой недели. Я всегда писал и получил ОК. На обоих сайтах. Но на этой неделе тест и реальная реализация проекта идут как капут. На обоих сайтах.
На местном сайте говорилось, что невозможно подключиться к SSL.
Эта проблема вызвана самоподписанным сертификатом, который по какой-то причине выходит за рамки моего понимания. Благодаря приведенным здесь вопросам я только что подтвердил сертификат, чтобы он всегда был верным, и теперь он больше не вызывает ошибок.
Чтобы это исправить, просто напишите:
ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();
В начале вашего приложения. Так что он запускается только один раз.
Остается проблема: «Удаленный сервер возвратил ошибку: (503) Сервер недоступен». Я ввожу URL в свой браузер, и он отлично работает для меня. В коде этот веб-сайт ничего не получает, и когда он переходит к ответу в Интернете, он выдает мне вышеуказанную ошибку
Я сделал тестовое приложение, которое отправляет только «Тестирование 1 2 3», но я продолжаю получать сообщение об ошибке. Я также отправил его на веб-сайт Гарварда https, и там не было ошибок.
private void btnSend_Click(object sender, EventArgs e)
{
try
{
WebRequest req = WebRequest.Create(cboUrl.Text);
req.PreAuthenticate = true;
req.UseDefaultCredentials = true;
req.Method = "POST";
req.ContentType = "text/xml";
String msg = txtMsg.Text;
using (Stream s = req.GetRequestStream())
{
try
{
s.Write(
System.Text.ASCIIEncoding.ASCII.GetBytes(msg), 0, msg.Length);
}
finally
{
s.Close();
}
}
WebResponse resp = req.GetResponse();
StreamReader str = new StreamReader(resp.GetResponseStream());
txtRes.Text = str.ReadToEnd();
}
catch (WebException ex)
{
txtRes.Text = ex.Message;
}
catch (Exception ex)
{
txtRes.Text = ex.Message;
}
}
Это еще один пример, который я построил из того, что нашел в интернете:
private void button1_Click(object sender, EventArgs e)
{
try
{
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(cboUrl.Text);
myReq.Headers.Clear();
myReq.Method = "POST";
myReq.KeepAlive = false;
myReq.ProtocolVersion = HttpVersion.Version11;
myReq.ContentType = "text/xml";
myReq.Proxy = null;
myReq.Credentials = null;
myReq.ContentLength = txtMsg.Text.Length;
using (StreamWriter sendingData = new StreamWriter(myReq.GetRequestStream()))
{
sendingData.Write(txtMsg.Text);
sendingData.Flush();
sendingData.Close();
}
HttpWebResponse myResponse = (HttpWebResponse) myReq.GetResponse();
StreamReader responseStream = new StreamReader(myResponse.GetResponseStream());
txtRes.Text = responseStream.ReadToEnd();
responseStream.Close();
myResponse.Close();
}
catch(WebException ex )
{
txtRes.Text = ex.Message;
}
catch (Exception ex)
{
txtRes.Text = ex.Message;
}
}
Обновление
Ошибка состояла в том, что тот, кому я звонил с httpwebrequest, нуждался в некоторых заголовках http, которые я не предоставлял. До того, как произошло единственное, я получил ответ «ОК». Они исправили свой код, а я исправил мой, и теперь он работает.
Если это случится с кем-то еще, проверьте, как указано ниже, в настройках прокси-сервера, а также проверьте, дает ли другая сторона исключение или вообще ничего не возвращает.