2015-06-16 6 views
20

HttpClient kullanarak C# içinde aşağıdaki curl (ben için çalışır) yapmaya çalışıyorum. Kimlik Doğrulama ile Post HttpClient nasıl kullanılır?

curl -X POST http://www.somehosturl.com \ 
    -u <client-id>:<client-secret> \ 
    -d 'grant_type=password' \ 
    -d 'username=<email>' \ 
    -d 'password=<password>' \ 
    -d 'scope=all 

C# Kod:

idam
HttpClientHandler handler = new HttpClientHandler { Credentials = new 
      System.Net.NetworkCredential ("my_client_id", "my_client_secret") 
    }; 


    try 
    { 
     using(var httpClient = new HttpClient(handler)) 
     { 
      var activationUrl = "www.somehosturl.com"; 

      var postData = "grant_type=password&[email protected]&password=mypass&scope=all"; 
      var content = new StringContent(postData, Encoding.UTF8, "application/x-www-form-urlencoded"); 

      var response = await httpClient.PostAsync(activationUrl, content); 
      if(!response.IsSuccessStatusCode) 
       return null; 

      var result = await response.Content.ReadAsStringAsync(); 

      return result; 
     } 
    } 
    catch(Exception) 
    { 
     return null; 
    } 

, sadece doesnt bile beni atma neyin

Normalde GET am güçlü ve POST ince mükemmel ama özel durumu yakalamak, dışarı çöküyor Kimlik doğrulama (istemci kimliği ve istemci-gizli)

+2

düştü tarafından ne anlama geliyor? Bunu VS'nin içinde mi kullanıyorsunuz? İlk Şans Kural Dışı Durumlarını açtınız mı? –

+0

Yararlı olup olmadığını görmek için bu Stackoverflow gönderisine göz atın: http://stackoverflow.com/a/23914662/1337635 – joehanna

+0

Lütfen yöntem imzası da dahil olmak üzere kodunuzu gönderir misiniz? –

cevap

14

Önce <clientid> ve <clientsecret> senin ile Authorization -Üstbilgi belirlemek zorunda. Bunun yerine aşağıda gösterildiği gibi FormUrlEncodedContent kullanmalıdır StringContent kullanmanın

:

var client = new HttpClient(); 
client.BaseAddress = new Uri("http://myserver"); 
var request = new HttpRequestMessage(HttpMethod.Post, "/path"); 

var byteArray = new UTF8Encoding().GetBytes("<clientid>:<clientsecret>"); 
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 

var formData = new List<KeyValuePair<string, string>>(); 
formData.Add(new KeyValuePair<string, string>("grant_type", "password")); 
formData.Add(new KeyValuePair<string, string>("username", "<email>")); 
formData.Add(new KeyValuePair<string, string>("password", "<password>")); 
formData.Add(new KeyValuePair<string, string>("scope", "all")); 

request.Content = new FormUrlEncodedContent(formData); 
var response = await client.SendAsync(request); 
+2

Açıklamalısınız * neden * bu sorunun bir cevabıdır. Yapıyor musun Kimlik doğrulama başlığını ayarlamak zorunda kalmanın üstüne, OP posta verilerini yanlış şekilde iletir mi? –

+0

Teşekkürler Alexander, bu harika çalışıyor! Ben Xamarin kullanıyorum, bu yüzden Encoding.ASCII kullanamadım, yeni UTF8Encoding(). GetBytes() kullanmak zorunda kaldım. – Jesse

+0

UTF8 anlamlıdır. Cevabımı güncelledim. –

13

Kimlik bilgilerinin doğrudan HttpClient öğesinin başlıklarına yerleştirilmeye çalışılır.

using (var client = new HttpClient()) { 
     var byteArray = Encoding.ASCII.GetBytes("my_client_id:my_client_secret"); 
     var header = new AuthenticationHeaderValue("Basic",Convert.ToBase64String(byteArray)); 
     client.DefaultRequestHeaders.Authorization = header; 

     return await client.GetStringAsync(uri); 
}