Проблемы с C # HTTP Post с аутентификацией - PullRequest
1 голос
/ 24 мая 2011

Я пытаюсь отправить XML через HTTP Post.Но я получаю 401 Unauthorized.Забавно, что когда я получаю доступ к URL через браузер, имя пользователя / пароль, которые я предоставляю, в порядке.

Вот моя подпись метода:

        internal static string Send(string URL, string XMLdata, string RequestMethod, 
                                    string RequestUsername, string RequestPassword)

Я пробовал это как тело метода:

        string requestData = XMLdata;
        string responseData = "";

        StreamWriter myWriter = null;
        HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(URL);

        objRequest.Method = RequestMethod;
        objRequest.PreAuthenticate = true;
        objRequest.ContentType = "application/x-www-form-urlencoded";//"text/xml";
        objRequest.Credentials = new NetworkCredential(RequestUsername, RequestPassword);;
        objRequest.ContentLength = requestData.Length;

        try
        {
            myWriter = new StreamWriter(objRequest.GetRequestStream());
            myWriter.Write(requestData);
        }
        finally
        {
            myWriter.Close();
        }

        StreamReader sr = null;

        try
        {
            HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
            sr = new StreamReader(objResponse.GetResponseStream());
            responseData = sr.ReadToEnd();
        }
        finally
        {
            if (sr != null)
                sr.Close();
        }

        return responseData;

А также это:

        string result;

        using (var client = new WebClient())
        {
            Uri requestUri = new Uri(URL);
            CredentialCache cache = new CredentialCache();
            NetworkCredential nc = new NetworkCredential(RequestUsername, RequestPassword);
            cache.Add(requestUri, "Basic", nc);
            client.Credentials = cache;

            result = client.UploadString(requestUri, XMLdata);
        }

        return result;

Оба получают 401.Что я делаю неправильно?Просто напоминание: когда я получаю доступ к URL-адресу через браузер, он запрашивает имя пользователя / пароль и предоставленные мной учетные данные в порядке.

Мои показания по этому вопросу на данный момент:

Я ценю помощь.

Ответы [ 2 ]

1 голос
/ 25 мая 2011

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

Поставщик отправил мне электронное письмо с URL http://api.providersurl.com.Когда я получаю это в браузере, он перенаправляется на https://api.providersurl.com (HTTPS!).Затем я могу авторизоваться с помощью учетных данных.

Забавная вещь, которая заставляла меня биться головой об стену, заключается в том, что при доступе к URL-адресу HTTP я не получаю ни 404 (Not Found), ни 302 (Redirect).Я получил 401 (Unauthorized).Так что я просто продолжал пытаться!И, боже, я попробовал ...

Когда я изменил URL-адрес в коде на HTTPS, авторизация работала с обоими кодами, которые я отправил.

Это заняло несколько часов ... Но неткогда вы учитесь получать опыт, время - пустая трата времени.

1 голос
/ 25 мая 2011

[По запросу OP я переношу свой комментарий в ответ]

У меня нет ответа от вашего описания, но у меня есть предложение: используйте Fiddler , чтобы увидеть, как выглядят запрос и ответ, как при успешном выполнении запроса браузера, так и когда программный запрос не выполняется. Я подозреваю, что будет разница, которая выскочит на вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...