2017-07-24 85 views
0

我正嘗試從Salesforce通過oauth獲取我的應用程序中的所有聯繫人。我得到遠程服務器返回錯誤:(400)錯誤的請求。試圖通過我的回調頁面上的API令牌網址獲取訪問令牌。甚至當我複製URL並直接粘貼到URL時,它會給我提供正確的數據。但無法獲得Access令牌。(400)Bad Request:獲取Salesforce的AccessToken

我正在使用下面的方法獲取訪問令牌。請專家建議我在哪裏做錯了。 Google和LinkedIn也採用相同的方法。

public async Task<TokenResponse> GetAccessToken(string code,string tokenUrl,string consumerKey,string consumerSecretKey,string redirecturl) 
    { 

     string responseFromServer = ""; 
     var webRequest = WebRequest.Create(tokenUrl); 

     const string queryStringFormat = @"code={0}&client_id={1}&client_secret={2}&redirect_uri={3}&grant_type=authorization_code"; 
     string contents = string.Format(queryStringFormat 
              , code 
              , consumerKey 
              , consumerSecretKey 
              , redirecturl); 

     webRequest.Method = "POST"; 
     byte[] postcontentsArray = Encoding.UTF8.GetBytes(contents); 
     webRequest.ContentType = "application/x-www-form-urlencoded"; 
     webRequest.ContentLength = postcontentsArray.Length; 
     using (Stream requestStream = webRequest.GetRequestStream()) 
     { 
      requestStream.Write(postcontentsArray, 0, postcontentsArray.Length); 
      requestStream.Close(); 
      WebResponse response = webRequest.GetResponse(); 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       if (responseStream != null) 
       { 
        using (StreamReader reader = new StreamReader(responseStream)) 
        { 
         responseFromServer = reader.ReadToEnd(); 
         reader.Close(); 
         responseStream.Close(); 
         response.Close(); 
        } 
       } 
      } 

     } 
     return JsonConvert.DeserializeObject<TokenResponse>(responseFromServer); 
    } 

請幫我解決這個問題。

+0

什麼是HTTP響應的主體?這通常會解釋錯誤。 – smarx

+0

你能澄清你的意思嗎?「甚至當我複製URL並直接粘貼到URL時,它會給我正確的數據」? – Crowcoder

+0

調試時我得到的URL來獲取響應。我有複製該URL並直接粘貼到瀏覽器上,它顯示正確的XML與訪問令牌。但在代碼中給出錯誤。 – Vijjendra

回答

1

我連接到Salesforce沒有問題,但使用HttpClient而不是WebRequest。

  ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; 

      HttpContent content = new FormUrlEncodedContent(new Dictionary<string, string> 
      { 
       {"grant_type", "password"}, 
       {"client_id", _clientId}, 
       {"client_secret", _clientSecret}, 
       {"username", _userName}, 
       {"password", _password} 
      } 
       ); 

       using (var httpClient = new HttpClient()) 
       { 
        var message = 
         await httpClient.PostAsync(_authorizationUrl, content).ConfigureAwait(false); 
        var responseString = await message.Content.ReadAsStringAsync().ConfigureAwait(false); 

        var obj = JObject.Parse(responseString); 

        var oauthToken = (string)obj["access_token"]; 
        var serviceUrl = (string)obj["instance_url"]; 
} 
+0

我已經根據我的要求做了一些改變。謝謝 – Vijjendra

相關問題