2014-01-31 2 views
3

У меня возникли проблемы с использованием API PingdomsPingdom успокоительного API C#

Я создал ключ для моего приложения и добавить его в заголовок моего запроса. Но я получаю 401 ERRORCODE :(

NetworkCredential nc = new NetworkCredential("my_email", "my_password", "httpS://api.pingdom.com/2.0/checks"); 
CredentialCache cc = new CredentialCache(); 
cc.Add("httpS://api.pingdom.com/2.0/checks", 443, "Basic", nc); 

HttpWebRequest request = HttpWebRequest)WebRequest.Create("httpS://api.pingdom.com/2.0/checks"); 
request.Proxy = new WebProxy("my_proxy",true); //I'm behind a strict firewall... 
request.Headers.Add("App-Key", "my_appKey"); 
request.ContentLength = 0; 
request.Credentials = cc; 
request.PreAuthenticate = true; 
request.Method = "POST"; 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

Im довольно потерял :(

Все, что я делаю я получаю:

An unhandled exception of type 'System.Net.WebException' occurred in System.dll 
Additional information: The remote server returned an error: (401) Unauthorized. 

рабочий код Благодаря @Guy I получил его на работу! heres мой рабочий код для тех, кто борется с той же проблемой

public class PingdomChecks 
{ 
    public List<PingdomCheck> Checks { get; set; } 
} 

public class PingdomCheck 
{ 
    public string ID { get; set; } 
    public int Created { get; set; } 
    public string Name { get; set; } 
    public string Hostname { get; set; } 
    public string Resolution { get; set; } 
    public int LastErrorTime { get; set; } 
    public int LastTestTime { get; set; } 
    public int LastResponseTime { get; set; } 
    public string Status { get; set; } 
    public string[] Tags { get; set; } 
} 

public class Tools 
{ 

    public static void SetBasicAuthHeader(WebRequest request, String userName, String userPassword) 
    { 
     string authInfo = userName + ":" + userPassword; 
     authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
     request.Headers["Authorization"] = "Basic " + authInfo; 
    } 

    public static void Pingdom() 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.pingdom.com/api/2.0/checks"); 
     request.Headers.Add("App-Key", "YOUR_APP_KEY"); 
     request.ContentLength = 0; 
     request.PreAuthenticate = true; 
     request.Method = "GET"; 
     SetBasicAuthHeader(request, "YOUR_EMAIL", "YOUR_PASSWORD"); 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     var stream = response.GetResponseStream(); 
     var reader = new StreamReader(stream); 
     var html = reader.ReadToEnd(); 

     PingdomCheck Checks = JsonConvert.DeserializeObject<PingdomCheck>(html); 
    } 

ответ

1

Некоторые серверы ожидают получить аутентификацию, не запрашивая ее. и C# не отправляет его, если вы просто используете request.Credentials = cc; вы можете видеть, что вам не хватает заголовка, если вы используете wirehark и смотрите, что он отправляет на сервер. Способ преодоления этого - заставить заголовок аутентификации.

//so instead of using: 
//request.Credentials = cc; 
//request.PreAuthenticate = true; 
//you should call: 

    SetBasicAuthHeader(request, "my_email", "my_password") 
    } 

    public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword) 
    { 
     string authInfo = userName + ":" + userPassword; 
     authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
     request.Headers["Authorization"] = "Basic " + authInfo; 
    } 
+0

Thanks @Guy Это сделало трюк :) – FlyingHippo

Смежные вопросы