Подтвердить что ты не робот

Проводка с использованием POST с С# по https

Потеряв два дня с этим вопросом (и пытаясь заставить его работать), я решил сделать шаг назад и задать более простой вопрос, потому что видимо, там что-то я не знаю, или я ошибаюсь.

Требования просты, мне нужно сделать HTTP-сообщение (передав несколько значений) по https с С#.

Веб-сайт (если заданы соответствующие значения) вернет несколько простых html и код ответа. (я покажу их позже).

Это действительно , что просто. Работает "webservice". У меня есть образец php, который работает и успешно соединяется с ним. У меня также есть приложение Dephi "demo" (с исходным кодом), которое также работает. И, наконец, у меня есть демо-приложение (двоичное) от компании, которая имеет "сервис", которая также работает, конечно.

Но мне нужно сделать это через С#. Это звучит так просто, он не работает.

В целях тестирования я создал простое консольное приложение и простой метод подключения. Я пробовал как 7 различных способов создать HTTP-запрос, все более или менее одно и то же, другую реализацию (с использованием WebClient, используя HttpWebRequest и т.д.).

Каждый метод работает, кроме, когда URI начинается с 'https'.

Я получаю webexception, говорящий, что удаленный сервер вернулся 404. Я установил Fiddler (как было предложено пользователем SO) и немного расследовал трафик. 404 состоит в том, что я передаю что-то неправильно, потому что, как я упоминал позже, работает "сервис". Я расскажу о результатах скрипача позже.

URL-адрес, где мне нужно отправить данные: https://servicios.mensario.com/enviomasivo/apip/

И это данные POST: (значения являются подделками)

= SomeUser Новичок & клаве = SomePassword & nserie = 01234567890123456789 & версия = 01010000 & Operacion = 220

Сервер может вернуть ответ двух/трех строк (извините за испанский, но компания из Испании). Здесь образец возможного ответа:

HTTP/1.1 200 OK
Content-Type: text/plain

01010000 100 BIEN
998

И вот еще

HTTP/1.1 200 OK
Content-Type: text/plain

01010000 20 AUTENTIFICACION NEGATIVA
Ha habido un problema en la identificación ante el servidor. Corrija sus datos de autentificacion.

Первый означает "ОК", а второй - "Ошибка при завершении".

Как вы видите, задача довольно проста, только она не работает. Если я использую скрипач, я вижу, что в связи с этим происходит какое-то соединение SSL, и тогда все работает нормально. Однако, насколько я читал,.NET обрабатывает все эти вещи для нас (да, я добавил обратный вызов, чтобы всегда проверять недействительные сертификаты). Я не понимаю, что я делаю неправильно. Я могу отправить/отправить код по электронной почте, но то, что я хотел бы знать, очень просто:

Как вы можете выполнить POST через SSL с помощью С# и "простого" HttpWebRequest, а затем получить ответ в строке/массиве/Что бы ни обрабатывалось?

Поверь мне, когда я скажу, что я работаю в поисковых системах и накладываю стопки на два дня. У меня нет прокси-сервера. Соединение проходит через мой маршрутизатор. Стандартные порты. Ничего особенного. Моя машина находится в виртуальной машине VMWare и является Windows Vista, но при условии, что примеры приложений (php, delphi, binary) работают без проблем, я не вижу в этом проблемы).

Различные образцы (без двоичного) доступны здесь, если кто-то хочет взглянуть на них.

Буду признателен за любую помощь. Если кто-то хочет попробовать с "настоящим" именем пользователя, у меня есть демонстрационный пользователь, и я могу передать вам пользователя/пароль для тестирования. У меня только один демонстрационный пользователь (тот, который они мне дали), и поэтому я не вставляю его здесь. Я не хочу наводнять пользователя тестами;)

Я пробовал (внутри образцов) с использованием UTF8 и ASCII, но это ничего не меняло.

Я на 100% уверен, что есть что-то, что я должен делать с SSL, и я не делаю этого, потому что я не знаю об этом.

Спасибо в advance.

Мартин.

4b9b3361

Ответ 1

см. мой ответ на другой вопрос. Я считаю, что ваша проблема может не быть вашим кодом С#. URL-адрес веб-службы обычно возвращает 404 с несколькими другими инструментами, которые я использовал, но он возвращает ответ, который вы указали, если вы оставите конечную косую черту с URL-адреса веб-службы, поэтому я предлагаю попробовать это.

Как ни странно, не имеет значения, существует ли конечный URL-адрес при отсутствии SSL. Что-то странное с этим веб-сервером, я думаю.

Ответ 2

Я боролся с одной и той же проблемой немного раньше (хотя и в компактных рамках). Вот мой вопрос и мой собственный ответ на это: Асинхронный WebRequest с POST-параметрами в .NET Compact Framework

Моя версия асинхронна, поэтому она немного сложнее, чем то, что вы ищете, но идея остается.

private string sendRequest(string url, string method, string postdata) {
    WebRequest rqst = HttpWebRequest.Create(url);

    // only needed, if you use HTTP AUTH
    //CredentialCache creds = new CredentialCache();
    //creds.Add(new Uri(url), "Basic", new NetworkCredential(this.Uname, this.Pwd));
    //rqst.Credentials = creds;
    rqst.Method = method;
    if (!String.IsNullOrEmpty(postdata)) {
        //rqst.ContentType = "application/xml";
        rqst.ContentType = "application/x-www-form-urlencoded";

        byte[] byteData = UTF8Encoding.UTF8.GetBytes(postdata);
        rqst.ContentLength = byteData.Length;
        using (Stream postStream = rqst.GetRequestStream()) {
            postStream.Write(byteData, 0, byteData.Length);
            postStream.Close();
        }
    }
    ((HttpWebRequest)rqst).KeepAlive = false;
    StreamReader rsps = new StreamReader(rqst.GetResponse().GetResponseStream());
    string strRsps = rsps.ReadToEnd();
    return strRsps;

}

Ответ 3

Не знаю, разрешила ли u эту проблему, это сообщение от года назад. Я испанский, и я тоже использую mensario.

для отправки и HTTP-запроса: (это в ASP, но процесс тот же)

Function enviarMsg2
   Dim oHTTP,inicio
   Dim strParametros
   Dim devolver

   Set oHTTP= server.CreateObject("Msxml2.ServerXMLHTTP")
   strParametros = "usuario="&usuario&"&clave="&clave&"&nserie="&nserie&"&     version=01010000&operacion=300&sms=1%0934635035526%0920041231233000%09Clinica+Paz%09Clinica+Paz+le+desea+Feliz+Navidad%2E&sms=2%0934612345678%0920041231233001%09Clinica+Paz%09Clinica+Paz+le+desea+Feliz+Navidad%2E"
'response.Write strParametros
'response.End
'Abrimos la conexión con el método POST, ya que estamos enviando una petición.
oHTTP.open "POST", "https://servicios.mensario.com/enviomasivo/apip", False

'Agregamos encabezados HTTP requeridos...
oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

'Enviamos la petición
oHTTP.send strParametros
devolver = oHTTP.responsetext

'Comprobamos si fue correcto         
inicio = Instr(devolver, "100 BIEN")
'response.Write "--->"&inicio
'response.End    
if inicio <=0 then
  enviarSMS2 = "Ha ocurrido un error en el envío del SMS."
else
  enviarSMS2 = Mid(devolver,inicio+9,len(devolver))
end if

Set oHTTP = Nothing

Единственное, что у меня нет, это пользователь/пароль для попытки:)

В основном, когда ответ "100 bien", функция возвращает это, в противном случае он возвращает ошибку. Упование помогает:)