2016-08-16 7 views
1

私はASP.NET Web APIにc#でアクセスしようとしています。私はAPIを書いて、それにアクセスして、Postmanを使って有効な応答を得ることができました。 username,password、およびgrant_type = passwordと表示されている場合、APIはaccess_tokenおよびrefresh_tokenを返します。ここでPostAsJsonAyncのunsupported_grant_type

はポストマンを使用しているとき、私は受信応答の画面キャプチャです:

enter image description here

しかし、私がしようとすると、次のC#コードを使用する場合:

var userToValidate = new UserToValidate 
{ 
    UserName = "[email protected]", 
    Password = "Abc123!", 
    grant_type = "password" 
}; 

using (var client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri("http://localhost:4321"); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    HttpResponseMessage response = client.PostAsJsonAsync("oauth/token", userToValidate).Result; 
    content = response.Content.ReadAsStringAsync().Result; 
} 

を私はエラーを取得します... {"error":"unsupported_grant_type"}

私はこのチュートリアルのC#側で何か間違っていなければなりませんngs。私は何が欠けていますか?

P.S. asyncコードをデバッグすると、ここで

+0

私はこのSOの投稿に解決策を見つけました。 http://stackoverflow.com/questions/29246908/c-sharp-unsupported-grant-type-when-calling-web-api JSONの代わりに 'application/x-www-form-urlencoded'を使わなければなりません。 – webworm

+0

また、PostDataを、UserToValidateクラスの代わりにKeyValuePairとして渡すことができます。 'List > postData = new List >(); postData.Add(新しいKeyValuePair <文字列、文字列>( "grant_type"、 "password"));postData.Add(新しいKeyValuePair <文字列、文字列>( "username"、userName));postData.Add(新しいKeyValuePair <文字列、文字列>( "パスワード"、パスワード)); ' – Paresh

+0

@Paresh - あなたはそれを回答として投稿できますか?私はそれを受け入れます。そうすれば、複数のオプションがあります。ありがとう。 – webworm

答えて

0

私はナットを駆動するので.Resultを使用すると、コンテンツはURLエンコードする必要がJSON

 using (var client = new HttpClient()) 
     { 
      var email = "xyz" 
      var password = "abc"; 
      var clientId = "123" 
      var clientSecret = "456"; 

      client.BaseAddress = new Uri(baseUrl); 

      // We want the response to be JSON. 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      // Build up the data to POST. 
      List<KeyValuePair<string, string>> postData = new List<KeyValuePair<string, string>>(); 

      postData.Add(new KeyValuePair<string, string>("grant_type", "password")); 
      postData.Add(new KeyValuePair<string, string>("client_id",  clientId)); 
      postData.Add(new KeyValuePair<string, string>("client_secret", clientSecret)); 
      postData.Add(new KeyValuePair<string, string>("username",  email)); 
      postData.Add(new KeyValuePair<string, string>("password",  password)); 



      // Post to the Server and parse the response. 
      HttpResponseMessage response = await client.PostAsJsonAsync("Token", postData); 
      string jsonString   = await response.Content.ReadAsStringAsync(); 
      object responseData   = JsonConvert.DeserializeObject(jsonString); 

      // return the Access Token. 
      accessToken = ((dynamic)responseData).access_token; 
     } 

     return accessToken; 
0

を使用してトークンを得ることができる方法です。 これは私のために働いた方法です:

関連する問題