2017-07-24 86 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

相关问题