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!
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
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 –
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. –