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));
Это должно работать правильно.