2014-01-31 37 views
3

我使用Pingdoms APIPingdom的宁静API C#

我已经产生为我的应用密钥,并将其添加到我的请求的报头中具有的麻烦。不过,我不断收到一个401错误代码:(

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我得到它的工作!继承人我的工作代码为任何人与同样问题苦苦挣扎

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; 如果您使用wireshark并查看它发送到服务器的内容,您可以看到您缺少Header。 解决此问题的方法是强制验证标头。

//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

谢谢@Guy那个诀窍:) – FlyingHippo