Ошибка аутентификации POST to HTTPS - PullRequest
3 голосов
/ 07 декабря 2010

Это простая публикация на сайте https с помощью консольного приложения C #, я тоже самое использовал с веб-сервисом. Когда я запускаю это, оно замерзает. Скачал скрипач и во вкладке Auth вижу Заголовок прокси-аутентификации отсутствует. Заголовок WWW-Authenticate отсутствует.

Ранее я использовал Stream вместо MemoryStream. Я прокомментировал некоторые вещи, которые использовал ранее, но не работал как предварительная аутентификация.

Я могу войти на сайт, чтобы получить подписчика через IE, используя того же пользователя и пароль. Может кто-нибудь, пожалуйста, скажите мне, что случилось?

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;

namespace Examples.System.Net
{
    public class WebRequestPostExample
    {
        public static void Main()
        {
            Uri requestUri = new Uri("https://services.yesmail.com/enterprise/subscribers");            

            // Set the Method property of the request to POST.   
            CredentialCache cache = new CredentialCache();
            NetworkCredential nc = new NetworkCredential("user/user1", "password");                 
            cache.Add(requestUri, "Basic", nc);
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri);

            //request.PreAuthenticate = true;
            //request.KeepAlive = false;

            request.Method = WebRequestMethods.Http.Post;
            request.ContentType = "application/xml;charset=ISO-8859-1";

            //request.ContentType = "application/xml-www-form-urlencoded";       
            //request.Timeout = 300000;


            string EmailAddress = "test999@test1.com";
            string FirstName = "first";
            string LastName = "Last";

            StringBuilder Efulfill = new StringBuilder();


            Efulfill.Append("EmailAddress" + HttpUtility.UrlEncode(EmailAddress));
            Efulfill.Append("FirstName" + HttpUtility.UrlEncode(FirstName));
            Efulfill.Append("LastName" + HttpUtility.UrlEncode(LastName));


            byte[] byteData = Encoding.UTF8.GetBytes(Efulfill.ToString());

            request.ContentType = "application/xml;charset=ISO-8859-1";

            request.ContentLength = byteData.Length;



            using (MemoryStream Stream = new MemoryStream(byteData))
            {
                // Write the stream.
                Stream.Write(byteData, 0, byteData.Length);
                Stream.Close();
            }
            //Get response   

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (Stream resStream = response.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(resStream, Encoding.Default);
                    Console.WriteLine(reader.ReadToEnd());
                }
            }


        }
    }
}

Ответы [ 4 ]

1 голос
/ 08 декабря 2010

Есть ли какая-то конкретная причина, по которой вы хотели бы написать оооочень много кода, когда вы можете просто:

using (var client = new WebClient())
{
    var requestUri = new Uri("https://services.yesmail.com/enterprise/subscribers");
    var cache = new CredentialCache();
    var nc = new NetworkCredential("user/user1", "password");
    cache.Add(requestUri, "Basic", nc);
    client.Credentials = cache;

    var values = new NameValueCollection
    {
        { "EmailAddress", "test999@test1.com" },
        { "FirstName", "first" },
        { "LastName", "last" },
    };

    var result = client.UploadValues(requestUri, values);
    Console.WriteLine(Encoding.Default.GetString(result));
}

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

Когда я запустил это, я получил 401 Unauthorized, но я предполагаю, что это потому, что имя пользователя и пароль, используемые для базовой аутентификации, являются фиктивными.

1 голос
/ 08 декабря 2010

Вы берете данные в byteData и записываете их поверх себя через MemoryStream? Вам нужно использовать HttpWebRequest.GetRequestStream, чтобы получить поток, написать свои данные постов и убедиться, что он закрыт.

0 голосов
/ 07 августа 2012

возможно, попытайтесь установить учетные данные в заголовке запроса.Я работал над проектом, в котором мне нужно запросить некоторые данные из веб-приложения, используя Spring Security, и единственный способ заставить его работать - это установить учетные данные в заголовке запроса.

код выглядит примерно так:

string authInfo = username + ":" + password;
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
request.Headers["Authorization"] = "Basic " + authInfo;

для получения более подробной информации см. Этот блог

http://charlie.cu.cc/2012/05/how-use-basic-http-authentication-c-web-request/

0 голосов
/ 08 декабря 2010

Я скопировал ваш код, и он не запустился, потому что вы ничего не делали с потоком опубликованных данных до получения ответа.Я скопировал код, и теперь он работает как ожидалось.Просто подставьте свои настоящие полномочия, и это хорошо.

Uri requestUri = new Uri("https://services.yesmail.com/enterprise/subscribers");            

// Set the Method property of the request to POST.   
var cache = new System.Net.CredentialCache();
var nc = new System.Net.NetworkCredential("user/user1", "password");                 
cache.Add(requestUri, "Basic", nc);
var request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(requestUri);

//request.PreAuthenticate = true;
//request.KeepAlive = false;

request.Method = System.Net.WebRequestMethods.Http.Post;
request.ContentType = "application/xml;charset=ISO-8859-1";

request.ContentType = "application/xml-www-form-urlencoded";       
//request.Timeout = 300000;

string EmailAddress = "test999@test1.com";
string FirstName = "first";
string LastName = "Last";

StringBuilder Efulfill = new StringBuilder();

Efulfill.Append("EmailAddress" + System.Web.HttpUtility.UrlEncode(EmailAddress));
Efulfill.Append("FirstName" + System.Web.HttpUtility.UrlEncode(FirstName));
Efulfill.Append("LastName" + System.Web.HttpUtility.UrlEncode(LastName));

byte[] byteData = Encoding.UTF8.GetBytes(Efulfill.ToString());

request.ContentType = "application/xml;charset=ISO-8859-1";
request.ContentLength = byteData.Length;

Stream postStream = request.GetRequestStream();
postStream.Write(byteData, 0, byteData.Length);
postStream.Close();

//Get response   

using (var response = (System.Net.HttpWebResponse)request.GetResponse())
{
    using (Stream resStream = response.GetResponseStream())
    {
        StreamReader reader = new StreamReader(resStream, Encoding.Default);
        Console.WriteLine(reader.ReadToEnd());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...