1

Nous tirons les derniers tweets d'un scénario sur Twitter, mais une erreur se produit: «L'algorithme de clé de certificat n'est pas pris en charge». avec un message "La connexion sous-jacente a été fermée: une erreur inattendue s'est produite sur une réception.". Cela n'arrive que sur scène et sur des serveurs live, pas sur ma machine de développement.L'API de clé de certificat n'est pas compatible avec l'API Twitter

La page renvoie une erreur de serveur standard. La classe que nous appelons avec le screenname est ci-dessous. Nous avons vérifié la clé de consommateur oAuth et le secret est également correct.

public static List<Tweet> GetTimeline(string screenName) 
{ 
    try 
    { 
     // Do the Authenticate 
     var authHeaderFormat = "Basic {0}"; 
     var authHeader = string.Format(authHeaderFormat, 
              Convert.ToBase64String(Encoding.UTF8.GetBytes(Uri.EscapeDataString(oAuthConsumerKey) + ":" + Uri.EscapeDataString((oAuthConsumerSecret))) 

               )); 
     var postBody = "grant_type=client_credentials"; 
     HttpWebRequest authRequest = (HttpWebRequest)WebRequest.Create(oAuthUrl); 

     authRequest.Headers.Add("Authorization", authHeader); 
     authRequest.Method = "POST"; 
     authRequest.ContentType = "application/x-www-form-urlencoded;charset=UTF-8"; 
     authRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
     using (Stream stream = authRequest.GetRequestStream()) 
     { 
      byte[] content = ASCIIEncoding.ASCII.GetBytes(postBody); 
      stream.Write(content, 0, content.Length); 
     } 
     authRequest.Headers.Add("Accept-Encoding", "gzip"); 
     WebResponse authResponse = authRequest.GetResponse(); 
     // deserialize into an object 
     TwitAuthenticateResponse twitAuthResponse; 
     using (authResponse) 
     { 
      using (var reader = new StreamReader(authResponse.GetResponseStream())) 
      { 
       JavaScriptSerializer js = new JavaScriptSerializer(); 
       var objectText = reader.ReadToEnd(); 
       twitAuthResponse = JsonConvert.DeserializeObject<TwitAuthenticateResponse>(objectText); 
      } 
     } 

     // Do the timeline 
     var timelineFormat = 
       "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={0}&include_rts=1&exclude_replies=1&count=20"; 
     var timelineUrl = string.Format(timelineFormat, screenName); 
     HttpWebRequest timeLineRequest = (HttpWebRequest)WebRequest.Create(timelineUrl); 
     var timelineHeaderFormat = "{0} {1}"; 
     timeLineRequest.Headers.Add("Authorization", string.Format(timelineHeaderFormat, twitAuthResponse.token_type, twitAuthResponse.access_token)); 
     timeLineRequest.Method = "Get"; 
     WebResponse timeLineResponse = timeLineRequest.GetResponse(); 

     var timeLineJson = string.Empty; 
     using (authResponse) 
     { 
      using (var reader = new StreamReader(timeLineResponse.GetResponseStream())) 
      { 
       timeLineJson = reader.ReadToEnd(); 
      } 
     } 

     JArray tweets = JArray.Parse(timeLineJson); 

     return (from t in tweets 
      select new Tweet 
      { 
       date = DateTime.ParseExact((string)t["created_at"], "ddd MMM dd HH:mm:ss +ffff yyyy", new System.Globalization.CultureInfo("en-US")), 
       link = t["entities"]["urls"].Count() > 0 ? (string)t["entities"]["urls"][0]["url"] : "", 
       tweet = LinkUpTweet((string)t["text"]), 
       author = (string)t["user"]["name"], 
       screenname = (string)t["user"]["screen_name"], 
       tweetLink = string.Format(@"https://twitter.com/{0}/status/{1}", screenName, (string)t["id_str"]) 
      }).ToList(); 
    } 
    catch (Exception ex) 
    { 
     // Send Email Error 
     return new List<Tweet>(); 
    } 

L'erreur se produit à WebResponse authResponse = authRequest.GetResponse(); mais je n'ai aucune idée comment résoudre ce problème.

Ajouter ce qui suit à web.config n'a aucune incidence sur le résultat

<system.diagnostics> 
    <switches> 
     <add name="System.Net" value="0"/> 
    </switches> 
</system.diagnostics> 

Un conseil ici?

Merci!

+0

Simple question: Avez-vous essayé d'accéder à l'URL à laquelle vous envoyez des messages dans un navigateur Web sur vos hôtes de serveur Staging et Prod? Je demande parce que votre problème ressemble à une erreur de poignée de main de certificat de bas niveau plutôt que quelque chose à faire avec la poignée de main oAuth/Basic Auth. – toadflakz

+0

Ce post suggère que la section system.diagnotics peut causer ce problème http://stackoverflow.com/questions/30576179/quand-could-cause-the-certificate-key-algorithm-is-not-supported-exception-on -a –

+0

J'ai vérifié sur le serveur et je vois juste une erreur générique du serveur interne. Je n'ai pas non plus la section system.diagnostics dans mon web.config et en l'ajoutant, ne fait aucune différence. J'avais lu ce message aussi, mais sans joie. –

Répondre

1

Avez-vous vérifié l'heure sur les serveurs qui échouent? Vous pouvez parfois voir les demandes échouer si l'heure des serveurs est à quelques minutes de l'heure sur les serveurs de Twitter. Assurez-vous que tout est synchronisé avec NTP et voyez si cela fonctionne.

0

Nous l'avons corrigé - je ne pense pas que nous découvrirons jamais ce qui l'a causé, mais nous avons effacé les DLL qui ont été compilées pour la solution, et reconstruit dans un nouveau dossier sur le serveur. Je suppose qu'une ligne de code quelque part dans le projet l'a brisé, mais ne saura jamais quoi malheureusement.

Nous avons vérifié l'heure sur les serveurs, mais tout semblait être OK là.