none
Help!Help! this function GetAccessToken() return value always null..... RRS feed

  • 问题

  • VS2008 ASP.NET 2.0

    Code:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Runtime.Serialization.Json;
    using System.Runtime.Serialization;
    using System.Web;
    using System.ServiceModel.Channels;
    using System.ServiceModel;
    
    namespace MicrosoftTranslatorSdk.HttpSamples
    {
        class Program
        {
            static void Main(string[] args)
            {
                AdmAccessToken admToken;
                string headerValue;
                //Get Client Id and Client Secret from     https://datamarket.azure.com/developer/applications/  //Edit by RedCat 2012-5-18 in this page Get Client Id and Client Secret !!!!!
                //Refer obtaining AccessToken (http://msdn.microsoft.com/en-us/library/hh454950.aspx) 
                AdmAuthentication admAuth = new AdmAuthentication("clientID", "client secret");
                try
                {
                    admToken = admAuth.GetAccessToken();
                    // Create a header with the access_token property of the returned token
                    headerValue = "Bearer " + admToken.access_token;
                    DetectMethod(headerValue);
    
                }
                catch (WebException e)
                {
                    ProcessWebException(e);
                    Console.WriteLine("Press any key to continue...");
                    Console.ReadKey(true);
                }
                catch (Exception ex)
                {
    
                    Console.WriteLine(ex.Message);
                    Console.WriteLine("Press any key to continue...");
                    Console.ReadKey(true);
                }
            }
    
            private static void DetectMethod(string authToken)
            {
                Console.WriteLine("Enter Text to detect language:");
                string textToDetect = Console.ReadLine();
                //Keep appId parameter blank as we are sending access token in authorization header.
                string uri = "http://api.microsofttranslator.com/v2/Http.svc/Detect?text=" + textToDetect;
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
                httpWebRequest.Headers.Add("Authorization", authToken);
                WebResponse response = null;
                try
                {
                    response = httpWebRequest.GetResponse();
                    using (Stream stream = response.GetResponseStream())
                    {
                        System.Runtime.Serialization.DataContractSerializer dcs = new System.Runtime.Serialization.DataContractSerializer(Type.GetType("System.String"));
                        string languageDetected = (string)dcs.ReadObject(stream);
                        Console.WriteLine(string.Format("Language detected:{0}", languageDetected));
                        Console.WriteLine("Press any key to continue...");
                        Console.ReadKey(true);
                    }
                }
    
                catch
                {
                    throw;
                }
                finally
                {
                    if (response != null)
                    {
                        response.Close();
                        response = null;
                    }
                }
            }
            private static void ProcessWebException(WebException e)
            {
                Console.WriteLine("{0}", e.ToString());
                // Obtain detailed error information
                string strResponse = string.Empty;
                using (HttpWebResponse response = (HttpWebResponse)e.Response)
                {
                    using (Stream responseStream = response.GetResponseStream())
                    {
                        using (StreamReader sr = new StreamReader(responseStream, System.Text.Encoding.ASCII))
                        {
                            strResponse = sr.ReadToEnd();
                        }
                    }
                }
                Console.WriteLine("Http status code={0}, error message={1}", e.Status, strResponse);
            }
        }
        [DataContract]
        public class AdmAccessToken
        {
            [DataMember]
            private string _access_token;
            public string access_token
            {
                get { return _access_token; }
                set { _access_token = value; }
            }
    
            [DataMember]
            private string _token_type;
            public string token_type
            {
                get { return _token_type; }
                set { _token_type = value; }
            }
    
            [DataMember]
            private string _expires_in;
            public string expires_in
            {
                get { return _expires_in; }
                set { _expires_in = value; }
            }
    
            [DataMember]
            private string _scope;
            public string scope
            {
                get { return _scope; }
                set { _scope = value; }
            }
    
        }
    
        public class AdmAuthentication
        {
            public static readonly string DatamarketAccessUri = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13";
            private string clientId;
            private string cientSecret;
            private string request;
    
            public AdmAuthentication(string clientId, string clientSecret)
            {
                this.clientId = clientId;
                this.cientSecret = clientSecret;
                //If clientid or client secret has special characters, encode before sending request
                this.request = string.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com", HttpUtility.UrlEncode(clientId), HttpUtility.UrlEncode(clientSecret));
            }
    
            public AdmAccessToken GetAccessToken()
            {
                return HttpPost(DatamarketAccessUri, this.request);
            }
    
            private AdmAccessToken HttpPost(string DatamarketAccessUri, string requestDetails)
            {
                //Prepare OAuth request 
                WebRequest webRequest = WebRequest.Create(DatamarketAccessUri);
                webRequest.ContentType = "application/x-www-form-urlencoded";
                webRequest.Method = "POST";
                byte[] bytes = Encoding.ASCII.GetBytes(requestDetails);
                webRequest.ContentLength = bytes.Length;
                using (Stream outputStream = webRequest.GetRequestStream())
                {
                    outputStream.Write(bytes, 0, bytes.Length);
                }
    
                using (WebResponse webResponse = webRequest.GetResponse())
                {
                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AdmAccessToken));
                    //Get deserialized object from JSON stream               
                    AdmAccessToken token = (AdmAccessToken)serializer.ReadObject(webResponse.GetResponseStream());
                    return token;
                }
    
    
                return null;
    
    
            }
        }
    }


    -------------------------------------------------------------------------

    aspx Page_Load Code:

            AdmAccessToken admToken;
            string headerValue;
            //Get Client Id and Client Secret from https://datamarket.azure.com/developer/applications/
            AdmAuthentication admAuth = new AdmAuthentication("45325432453543", "eb5WLTSpFDgigkDBhlkjgsvuS3jDkRCcK");
    
            admToken = admAuth.GetAccessToken();
            // Create a header with the access_token property of the returned token
            headerValue = "Bearer" + " " + HttpUtility.UrlEncode(admToken.access_token);


    -----------------------------------------------------------------------------------------------------------------------------

    Question:

    clientId,clientSecret No problem.but 

    admToken = admAuth.GetAccessToken();

    admToken.access_token


    Always Return Null. I have a headache, do not know where the problem.

    Urgent, please help me!


    • 已编辑 RedCat01 2012年5月18日 3:54
    2012年5月18日 3:52

答案

  • Hi RedCat,

    It seems that you made a wrong data class, please change it like this and try again:

        [DataContract]
        public class AdmAccessToken
        {
            [DataMember]
            public string access_token;
    
            [DataMember]
            public string token_type;
    
            [DataMember]
            public string expires_in;
    
            [DataMember]
            public string scope;
    
        }

    Best regards,


    Mike Feng
    MSDN Community Support | Feedback to us
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年5月21日 6:37
    版主