2012-03-22 2 views
2

Мне нужно выполнить запрос cURL, чтобы захватить CSV-файл из Интернета. Я никогда не использовал Curl до и до сих пор материал, который я видел через Google, кажется, не имеет смысла:cURL call in C#

локонов вызов должен выглядеть следующим образом:

curl --user username:password http://somewebsite.com/events.csv 

код, который я пытаюсь использовать (я использую это, чтобы захватить основные файлы XML аутентификации)

string URL = "http://somewebsite.com/events.csv"; 
string Username = "username"; 
string Password = "password"; 
WebClient req = new WebClient(); 

CredentialCache myCache = new CredentialCache(); 
myCache.Add(new Uri(URL), "Basic", new NetworkCredential(Username, Password)); 

req.Credentials = myCache; 

string results = null; 
results = Encoding.UTF8.GetString(req.DownloadData(URL)); 

Это просто дает мне обратно HTML для экрана входа в систему, так что аутентификация не происходит.

+0

Вы пытались: 'req.Credentials = new NetworkCredential (Username, Password);'? – leppie

+0

Просто попробовал, вернул мне ту же страницу входа в html. –

ответ

3

Я нашел проблему. По-видимому, запрос терпит неудачу, когда вы передаете знак @ (например, имя пользователя электронной почты) в поле имени пользователя, чтобы он был преобразован в строку базы 64. Вот код на всякий случай, если кто-то еще сталкивается с этим:

string url = "https://website.com/events.csv"; 
    WebRequest myReq = WebRequest.Create(url);  
    string username = "username"; 
    string password = "password"; 
    string usernamePassword = username + ":" + password; 
    CredentialCache mycache = new CredentialCache(); 
    mycache.Add(new Uri(url), "Basic", new NetworkCredential(username, password)); 
    myReq.Credentials = mycache; 
    myReq.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword))); 

    WebResponse wr = myReq.GetResponse(); 
    Stream receiveStream = wr.GetResponseStream(); 
    StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8); 
    string content = reader.ReadToEnd(); 
    Console.WriteLine(content); 
    Console.ReadLine(); 
1

Похоже, вы пытаетесь использовать протокол BasicAuth для входа на сайт? Если вы возвращаете HTML-страницу с экрана входа в систему, сайт не использует BasicAuth. BasicAuth это те URL-адреса в старом стиле вы редко видите, как:

username:[email protected]://somewebsite.com/events.csv 

С BasicAuth, ваш браузер обрабатывает аутентификацию с небольшим количеством всплывающего окна.

Чтобы получить доступ к этому сайту с помощью curl, вам необходимо перейти на страницу входа в систему, заполнив форму, отправив или подтвердив с помощью cookie, токена или какого-либо другого метода.

+0

Файлы XML, в которых я использую этот код, используют базовый auth, этот вызов должен использовать cURL для доступа к CSV-файлу. –

+0

Проблема заключается в знаке @ в имени пользователя (который является адресом электронной почты) мне пришлось преобразовать его в Base 64. –