none
Erreur lors du chargement des headers RRS feed

  • Question

  • Bonjour,

    Je cherche à utiliser Bing Translator dans mon Application Universelle. Pour cela, j'ai repris le code existant proposé ici : http://blogs.msdn.com/b/translation/p/windows8walkthrough.aspx

    A la section 3.1, après le chargement du token de connexion, on modifie les headers pour que le token d'identification soit pris en compte par ce code :

    client.DefaultRequestHeaders.Add("Authorization", auth);

    Or, à l'exécution, une exception se produit avec le message "Paramètre" incorrect. Évidemment, si on ne modifie pas les headers, la requête est bien envoyée mais le serveur renvoi une erreur 400 (Bad request).

    Notez que je sais que le reste fonctionne (identification et secret) puisque la traduction est effective sur mon Apps Windows Phone 8.0.


    dimanche 27 avril 2014 12:52

Réponses

  • Bonjour,

    J'ai finalement réécrit la partie traduction en utilisant un WebRequest, le rejet venant du HTTPClient qui ne supporte pas ce genre d'authentification.

            private async Task<String> Translate(String text, String sourceLanguage, String targetLanguage)
            {
                String clientID = "ClientID";
                String clientSecret = "ClientSecret";
                var authentication = new AzureDataMarket(clientID, clientSecret);
                AzureDataMarket.Token m_Token = await authentication.GetTokenAsync();
                String auth = m_Token.Header;
                Uri requestUri = new Uri("http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + System.Net.WebUtility.UrlEncode(text) + "&from=" + sourceLanguage + "&to=" + targetLanguage);
                WebRequest translationWebRequest = HttpWebRequest.Create(requestUri);
                String headerValue = "Bearer " + m_Token.access_token;
                translationWebRequest.Headers["Authorization"] = headerValue;                    
                String translatedText;
                try
                {
                    var response = await translationWebRequest.GetResponseAsync();
                    using (Stream streamResponse = response.GetResponseStream())
                    {
                        StreamReader streamRead = new StreamReader(streamResponse);
                        String strTranslated = streamRead.ReadToEnd();
                        System.Xml.Linq.XDocument xTranslation = System.Xml.Linq.XDocument.Parse(strTranslated);
                        String strTransText = xTranslation.Root.FirstNode.ToString();
                        if (strTransText == text)
                        {
                            translatedText = "";
                        }
                        else
                        {
                            translatedText = strTransText;
                        }
                    }
                }
                catch
                {
                    translatedText = text;
                }
                return translatedText;
            }
    De cette manière, ça fonctionne parfaitement.

    • Marqué comme réponse Aarklendoia mardi 29 avril 2014 15:21
    mardi 29 avril 2014 15:21

Toutes les réponses

  • Bonjour

    Le clientSecret  ressemble à quelque chose en format Base64.
    Vous le fournissez en même format?
    Voir ici :
    http://www.base64encode.org/

    Bien cordialement, 


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 28 avril 2014 10:20
  • Oui, enfin, je l'ai pris tel quel sur mon compte Azure et ça fonctionne parfaitement avec mon Apps en version Windows Phone Silverlight 8 et ça ressemble bien à un encodage en Base64.

    Là le problème est après l'identification (qui a réussi donc), quand on a récupéré le token et que grâce à lui on initie la traduction en passant le résultat obtenu comme chaîne d'identification.

    Le nouveau header est rejeté car détecté comme mal formé par WinRT alors qu'il a été fourni par Azure en réponse à l'identification. A moins que ça soit un bogue dans WinRT 8.1 !


    lundi 28 avril 2014 13:12
  • Voici les deux codes que j'utilise. Le premier est celui sous Windows Phone Silverlight 8.0 et le second celui sous Windows Universal Apps :

                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AdmAccessToken));
                    AdmAccessToken token = (AdmAccessToken)serializer.ReadObject(response.GetResponseStream());
                    String uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + HttpUtility.UrlEncode(this.textToTranslate) + "&from=" + this.sourceLanguage + "&to=" + this.targetLanguage;
                    WebRequest translationWebRequest = HttpWebRequest.Create(uri);
                    String headerValue = "Bearer " + token.access_token;
                    translationWebRequest.Headers["Authorization"] = headerValue;
                    IAsyncResult writeRequestStreamCallback = (IAsyncResult)translationWebRequest.BeginGetResponse(new AsyncCallback(TranslationReady), translationWebRequest);

                var _Authentication = new AzureDataMarket(clientID, clientSecret);
                AzureDataMarket.Token m_Token = await _Authentication.GetTokenAsync();
                String auth = m_Token.Header;
                HttpClient httpClient = new HttpClient();
                var headers = httpClient.DefaultRequestHeaders;
                try
                {
                    httpClient.DefaultRequestHeaders.Add("Authorization", auth);
                }
                catch
                {
                    return "";
                }
                Uri RequestUri = new Uri("http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + System.Net.WebUtility.UrlEncode(text) + "&from=" + sourceLanguage + "&to=" + targetLanguage);

    La valeur retournée dans le second cas par GetTokenAsync() est composée de "Bearer" suivit d'une chaîne de caractères comme celle formée dans le premier cas.

    Je n'ai pas comparé exactement la chaîne pour vois s'il y a une différence notable qui provoquerai une erreur (je regarderai ça en détail dès que possible).

    En toute logique, on effectue bien le même traitement pour s'identifier auprès du service. Dans le premier cas, ça fonctionne parfaitement, dans le second, le header est rejeté.

    mardi 29 avril 2014 10:10
  • Prenez quelques minutes pour regarder cet article :

    http://codepaste.net/hgrb91

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 29 avril 2014 12:58
  • Bonjour,

    J'ai finalement réécrit la partie traduction en utilisant un WebRequest, le rejet venant du HTTPClient qui ne supporte pas ce genre d'authentification.

            private async Task<String> Translate(String text, String sourceLanguage, String targetLanguage)
            {
                String clientID = "ClientID";
                String clientSecret = "ClientSecret";
                var authentication = new AzureDataMarket(clientID, clientSecret);
                AzureDataMarket.Token m_Token = await authentication.GetTokenAsync();
                String auth = m_Token.Header;
                Uri requestUri = new Uri("http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + System.Net.WebUtility.UrlEncode(text) + "&from=" + sourceLanguage + "&to=" + targetLanguage);
                WebRequest translationWebRequest = HttpWebRequest.Create(requestUri);
                String headerValue = "Bearer " + m_Token.access_token;
                translationWebRequest.Headers["Authorization"] = headerValue;                    
                String translatedText;
                try
                {
                    var response = await translationWebRequest.GetResponseAsync();
                    using (Stream streamResponse = response.GetResponseStream())
                    {
                        StreamReader streamRead = new StreamReader(streamResponse);
                        String strTranslated = streamRead.ReadToEnd();
                        System.Xml.Linq.XDocument xTranslation = System.Xml.Linq.XDocument.Parse(strTranslated);
                        String strTransText = xTranslation.Root.FirstNode.ToString();
                        if (strTransText == text)
                        {
                            translatedText = "";
                        }
                        else
                        {
                            translatedText = strTransText;
                        }
                    }
                }
                catch
                {
                    translatedText = text;
                }
                return translatedText;
            }
    De cette manière, ça fonctionne parfaitement.

    • Marqué comme réponse Aarklendoia mardi 29 avril 2014 15:21
    mardi 29 avril 2014 15:21