2016-11-24 4 views
1

을 얻으므로 HttpClient이 "better"이기 때문에 WebClientHttpClient으로 변환해야하지만 예상대로 작동하지 않습니다. 다음 함수는 WebClient을 사용하며 매력처럼 작동합니다.HttpClient를 사용하여

private static void Authenticate() 
{ 
    Console.WriteLine("Authenticating . . ."); 
    var clientId = ConfigurationManager.AppSettings["AuthNClientId"]; 
    var uri = ConfigurationManager.AppSettings["AuthNUri"]; 
    var userName = ConfigurationManager.AppSettings["AuthNUserName"]; 
    var password = ConfigurationManager.AppSettings["AuthNPassword"]; 

    var client = new WebClient(); 
    string formData = $"client_id={clientId}&grant_type=password&username={userName}&password={password}"; 
    client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; 
    var response = client.UploadString($"{uri}", formData); 
    dynamic authResult = JsonConvert.DeserializeObject(response); 
    _accessToken = authResult.access_token; 
    if (_accessToken == null) 
    { 
     throw new ApplicationException("Unable to authenticate. Check your configuration file <appSettings>."); 
    } 
    Console.WriteLine("Authenticated."); 
} 

이 코드는 BadRequest 응답 코드를 반환합니다.

static async Task<string> GetAuthenticationToken() 
{ 
    string token = string.Empty; 

    var clientId = ConfigurationManager.AppSettings["AuthNClientId"]; 
    var uri = ConfigurationManager.AppSettings["AuthNUri"]; 
    var userName = ConfigurationManager.AppSettings["AuthNUserName"]; 
    var password = ConfigurationManager.AppSettings["AuthNPassword"]; 

    client.BaseAddress = new Uri("https://myurl.com/oauth2/token"); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Add("ContentType", "application/x-www-form-urlencoded"); 

    var path = $"client_id={clientId}&grant_type=password&username={userName}&password={password}"; 
    HttpResponseMessage response = await client.GetAsync($"https://myurl.com/oauth2/token?{path}"); 
    if (response.IsSuccessStatusCode) 
    { 
     Console.WriteLine("success"); 
     token = await response.Content.ReadAsStringAsync(); 
    } 
    else { Console.WriteLine($"failure: {response.StatusCode}"); } 
    return token; 
} 

당신은 내가 그것을 클라이언트 BaseAddress 설정뿐만 아니라 단지 GetAsync 방법에 URL을 전달하는 시도를 포함하는 방법의 몇 가지를 시도했습니다 것을 볼 수 있습니다.

누구나 내가 뭘 잘못보고있는 걸까요?

+4

'HttpClient' 코드에서,'client'가 초기화되는 것을 보여주지 않습니다. – Eris

답변

0

UploadString은 첫 번째 예에서 POST 메소드입니다. 두 번째 예에서는 GET 메서드가 수행되고 있습니다.

static async Task<string> GetAuthenticationTokenAsync() { 
    string token = string.Empty; 

    var clientId = ConfigurationManager.AppSettings["AuthNClientId"]; 
    var uri = ConfigurationManager.AppSettings["AuthNUri"]; 
    var userName = ConfigurationManager.AppSettings["AuthNUserName"]; 
    var password = ConfigurationManager.AppSettings["AuthNPassword"]; 

    var client = new HttpClient(); 
    client.BaseAddress = new Uri(uri); 
    client.DefaultRequestHeaders.Accept.Clear(); 

    var nameValueCollection = new Distionary<string, string>() { 
     { "client_id", clientId }, 
     { "grant_type", "password" }, 
     { "username", userName }, 
     { "password", password }, 
    }; 
    var content = new FormUrlEncodedContent(nameValueCollection); 
    var response = await client.PostAsync("", content); 
    if (response.IsSuccessStatusCode) { 
     Console.WriteLine("success"); 
     var json = await response.Content.ReadAsStringAsync(); 
     dynamic authResult = JsonConvert.DeserializeObject(json); 
     token = authResult.access_token; 
    } 
    else { Console.WriteLine($"failure: {response.StatusCode}"); } 
    return token; 
} 
관련 문제