C# Twitter API无效或已过期的令牌

C# Twitter API无效或已过期的令牌,c#,model-view-controller,twitter,restsharp,C#,Model View Controller,Twitter,Restsharp,我试图使用下面的代码,但由于某种原因,我得到了一个无效或过期的令牌,它似乎工作了一次,但再也没有 有什么想法吗?(consumerKey和ConsumerCret是类中生成的常量。) public ActionResult Index() { 字符串twitterAccount=System.Configuration.ConfigurationManager.AppSettings[“twitterAccount”]; JsonDeserializer JsonDeserializer=新的J

我试图使用下面的代码,但由于某种原因,我得到了一个无效或过期的令牌,它似乎工作了一次,但再也没有

有什么想法吗?(consumerKey和ConsumerCret是类中生成的常量。)

public ActionResult Index()
{
字符串twitterAccount=System.Configuration.ConfigurationManager.AppSettings[“twitterAccount”];
JsonDeserializer JsonDeserializer=新的JsonDeserializer();
var model=new TwitterVM.LandingModel();
var qs=GetToken();
字符串oauthToken=qs[“oauth_token”];
字符串oauthTokenSecret=qs[“oauth_-token_-secret”];
RestClient=新的RestClient(“https://api.twitter.com/1.1")
{
Authenticator=OAuth1Authenticator.ForProtectedResource(consumerKey、ConsumerCret、oauthToken、oauthTokenSecret)
};
重新请求请求=新的重新请求(“状态/用户时间线”,Method.GET);
request.Parameters.Add(新参数()
{
Name=“screen\u Name”,
Value=twitter帐户,
Type=参数Type.GetOrPost
});
request.Parameters.Add(新参数()
{
Name=“count”,
值=10,
Type=参数Type.GetOrPost
});
request.Parameters.Add(新参数()
{
Name=“包括”,
值=真,
Type=参数Type.GetOrPost
});
request.Parameters.Add(新参数()
{
Name=“包括实体”,
值=真,
Type=参数Type.GetOrPost
});
IRestResponse response=client.Execute(请求);
模型。推特=
反序列化(响应);
返回视图(模型);
}
私有名称ValueCollection GetToken()
{
RestClient=新的RestClient(“https://api.twitter.com“{Authenticator=OAuth1Authenticator.ForRequestToken(consumerKey,ConsumerCret)};
//做授权的狗屎。。。
RestRequest请求=新的RestRequest(“oauth/request_token”,Method.POST);
IRestResponse response=client.Execute(请求);
返回HttpUtility.ParseQueryString(response.Content);
}

使用Twitter的OAuth2 API()

有关详细信息,请参阅

var client = await CreateHttpClient("....", "....");
//don't dispose this client and use for subsequent API calls

var screenName = "....";
var count = 10;
var include_rts = true;
var url = $"https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={screenName}&include_rts={include_rts}&count={count}";

var json = await client.GetStringAsync(url);

公共静态异步任务CreateHttpClient(字符串consumerKey,字符串ConsumerCret)
{
var bearerToken=Convert.ToBase64String(Encoding.UTF8.GetBytes(consumerKey+“:“+consumerSecret));
字符串url=”https://api.twitter.com/oauth2/token";
HttpClient=新的HttpClient();
client.DefaultRequestHeaders.tryadd未经验证(“授权”、“基本”+bearerToken);
var resp=await client.PostAsync(url,新的StringContent(“授予\类型=客户端\凭据”,Encoding.UTF8,“应用程序/x-www-form-urlencoded”))。ConfigureAwait(false);
resp.EnsuccessStatusCode();
var result=await resp.Content.ReadAsStringAsync().ConfigureAwait(false);
var jObj=new JavaScriptSerializer()。反序列化(结果);
if(jObj[“token_type”]!=“bearer”)抛出新异常(“来自Twitter/OAuth的无效响应”);
client.DefaultRequestHeaders.Remove(“授权”);
client.DefaultRequestHeaders.TryAddWithoutValidation(“授权”、“承载人”+jObj[“访问令牌”);
返回客户;
}

我将oauth2 api与HttpClient一起使用(无RestSharp)。。如果你感兴趣的话,我可以发布一个示例代码。是的,如果你可以的话,请发布。那太好了。。我作为答案发布了……我的应用程序锁定在这一行
var resp=wait client.PostAsync(url,new StringContent(“grant\u type=client\u credentials”,Encoding.UTF8,“application/x-www-form-urlencoded”)@Zhorian我在发布之前测试过它。。。这可能是死锁情况()。你能在clean应用程序中测试它吗?@Zhorian顺便说一句:我用
ConfigureAwait(false)
更新了代码。是的,我不得不在其他几个地方添加
ConfigureAwait(false)
,结果成功了!现在我只需要找出为什么反序列化程序不返回tweet实体。
var client = await CreateHttpClient("....", "....");
//don't dispose this client and use for subsequent API calls

var screenName = "....";
var count = 10;
var include_rts = true;
var url = $"https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={screenName}&include_rts={include_rts}&count={count}";

var json = await client.GetStringAsync(url);
public static async Task<HttpClient> CreateHttpClient(string consumerKey, string consumerSecret)
{
    var bearerToken = Convert.ToBase64String(Encoding.UTF8.GetBytes(consumerKey + ":" + consumerSecret));
    string url = "https://api.twitter.com/oauth2/token";


    HttpClient client = new HttpClient();

    client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Basic " + bearerToken);

    var resp = await client.PostAsync(url, new StringContent("grant_type=client_credentials", Encoding.UTF8, "application/x-www-form-urlencoded")).ConfigureAwait(false);
    resp.EnsureSuccessStatusCode();
    var result = await resp.Content.ReadAsStringAsync().ConfigureAwait(false);
    var jObj = new JavaScriptSerializer().Deserialize<Dictionary<string,string>>(result);

    if (jObj["token_type"] != "bearer") throw new Exception("Invalid Response From Twitter/OAuth");

    client.DefaultRequestHeaders.Remove("Authorization");
    client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Bearer " + jObj["access_token"]);
    return client;
}