Appharbor JustOneDB запрос https от C# получает 400 ошибок

Я пытаюсь сделать https GET для JustOneDB, это работает, если я делаю это из утилиты curl. Но это не работает с C#. Я получаю (400) Плохой запрос

Я искал вокруг и отключил охрану и все такое, но она все еще не работает. Есть идеи? Кто-нибудь делал это с отдыхом и JustOneDB?

Это работает вместе со всеми остальными примерами:

curl -k -XGET 'https://username:password@77.92.68.105:31415/justonedb/database/database name'

Это НЕ РАБОТАЕТ: Я выдал строку, чтобы удалить свой пароль.

   public ActionResult JustOneDb()
    {
        ///////////
        HttpWebRequest request = null;
        HttpWebResponse response = null;
        try
        {

            String Xml;
            //curl -k -XGET 'https://zn0lvkpdhdxb70l2_DUMMY_urshn5e7i41lb3fiwuh@77.92.68.105:31415/justonedb/database/n10lvkpdhdxei0l2uja'
            string url = @"https://zn0lvkpdhdxb70_DUMMY_urshn5e7i41lb3fiwuh@77.92.68.105:31415/justonedb/database/n10lvkpdhdxei0l2uja";

            request = (HttpWebRequest)WebRequest.Create(url);

            request.Method = "GET";

            request.Credentials = CredentialCache.DefaultCredentials;

            // Ignore Certificate validation failures (aka untrusted certificate + certificate chains)
            ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); 


            // Get response 
            using (response = (HttpWebResponse)request.GetResponse())
            {
                // Get the response stream 
                StreamReader reader = new StreamReader(response.GetResponseStream());
                Xml = reader.ReadToEnd();
            }
            return Content(Xml);
        }
        catch (Exception ee)
        {
            return Content(ee.ToString());

        }
        //////////////

        ViewBag.fn = "*.xml";
        return View();
    }

Результаты:

System.Net.WebException: The remote server returned an error: (400) Bad Request. at System.Net.HttpWebRequest.GetResponse() 
at Mvc3Razor.Controllers.MyXmlController.JustOneDb() ...

TIA FxM: {

3 ответа

Вместо того, чтобы передавать пароль имени пользователя в URL, вы должны создать правильные учетные данные с "username" и "password". Возможно, вы захотите использовать что-то вроде RestSharp вместо raw WebRequest,

Произошло несоответствие с сертификатом, который был исправлен. Он все еще самоподписан, но теперь имя хоста совпадает. Мы скоро перейдем на использование полностью подписанного сертификата, но пока сообщите мне, работает ли он только с самозаверяющим переопределением.

Хорошо, я скопировал код, и проблема в том, что библиотека HttpWebRequest не добавляет заголовок аутентификации в исходном запросе. Решение состоит в том, чтобы вставить заголовок вручную, поэтому, если вы добавите следующие две строки после строки 'request.Method = "GET" (и удалите имя пользователя / пароль из строки URL):

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

Это должно работать правильно.

Другие вопросы по тегам