C# 访问受保护twitter的推文时出现问题

C# 访问受保护twitter的推文时出现问题,c#,asp.net-mvc,twitter,twitter-oauth,C#,Asp.net Mvc,Twitter,Twitter Oauth,我目前在下面的类中遇到了问题,它给出了一个“400(坏请求)”错误 我正在尝试访问我们受保护的推特订阅源的推特,据我所知,所需的一切都在那里。希望一双新鲜的眼睛能帮上忙;如果你能发现任何问题,请告诉我 public class TwitterConnector { //Access credentials for the Retail twitter app: https://apps.twitter.com/app/6147494 //Bloody twitter API!!

我目前在下面的类中遇到了问题,它给出了一个“400(坏请求)”错误

我正在尝试访问我们受保护的推特订阅源的推特,据我所知,所需的一切都在那里。希望一双新鲜的眼睛能帮上忙;如果你能发现任何问题,请告诉我

public class TwitterConnector
{
    //Access credentials for the Retail twitter app: https://apps.twitter.com/app/6147494
    //Bloody twitter API!!
    const string _oAuthConsumerKey = "";
    const string _oAuthConsumerSecret = "";
    const string _oAuthAccessToken = "";
    const string _oAuthAccessSecret = "";

    //returns 32 character string
    private static string GenerateNonce(int length)
    {
        var data = new byte[length];
        //create random bytes
        new RNGCryptoServiceProvider().GetNonZeroBytes(data);
        return Convert.ToBase64String(data);
    }

    public static WebResponse GetTweetsResponse(string bearerToken)
    {
        //Timeline URL
        var timelineURL = "https://api.twitter.com/1.1/statuses/home_timeline.json";

        //OAuth variables
        var oAuthVersion = "1.0";
        var oAuthSignatureMethod = "HMAC-SHA1";

        var oAuthNonce = GenerateNonce(24);
        TimeSpan timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
        var oAuthTimestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();
        var tweetsCount = "20";

        // Generate OAuth signature. Note that Twitter is very particular about the format of this string. Even reordering the variables
        // will cause authentication errors.

        var baseFormat = "count={6}&oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" +
                         "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}";

        var baseString = string.Format(baseFormat,
            _oAuthConsumerKey,
            oAuthNonce,
            oAuthSignatureMethod,
            oAuthTimestamp,
            _oAuthAccessToken,
            oAuthVersion,
            Uri.EscapeDataString(tweetsCount)
        );

        baseString = string.Concat("GET&", Uri.EscapeDataString(timelineURL), "&", Uri.EscapeDataString(baseString));

        // Generate an OAuth signature using the baseString

        var compositeKey = string.Concat(Uri.EscapeDataString(_oAuthConsumerSecret), "&", Uri.EscapeDataString(_oAuthAccessSecret));
        string oAuthSignature;

        using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey)))
        {
            oAuthSignature = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)));
        }

        // Now build the Authentication header. Again, Twitter is very particular about the format. Do not reorder variables.

        var headerFormat = "OAuth " +
            "oauth_consumer_key=\"{0}\", " +
            "oauth_nonce=\"{1}\", " +
            "oauth_signature=\"{2}\", " +
            "oauth_signatureMethod=\"{3}\", " +
            "oauth_timestamp=\"{4}\", " +
            "oauth_token=\"{5}\", " +
            "oauth_version=\"{6}\"";

        var authHeader = string.Format(headerFormat,
            Uri.EscapeDataString(_oAuthConsumerKey),
            Uri.EscapeDataString(oAuthNonce),
            Uri.EscapeDataString(oAuthSignature),
            Uri.EscapeDataString(oAuthSignatureMethod),
            Uri.EscapeDataString(oAuthTimestamp),
            Uri.EscapeDataString(_oAuthAccessToken),
            Uri.EscapeDataString(oAuthVersion)
        );

        ServicePointManager.Expect100Continue = false;
        var postBody = string.Format("count={0}", Uri.EscapeDataString(tweetsCount));
        timelineURL += "?" + postBody;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(timelineURL);
        request.Headers.Add("Authorization", authHeader);
        request.Method = "GET";
        request.ContentType = "application/x-www-form-urlencoded";

        return request.GetResponse();
    }
}

在您的真实代码中,您真的拥有使用者和访问密钥/机密吗?您自己实现OAuth而不是使用现有的包装器有什么原因吗?我有。我看过一些现有的库,我只是想了解发生了什么,因为我以前从未使用过OAuth。为了方便起见,我现在可能只看一看现有的OAuth包装器,但如果您或任何阅读本文的人能够更正他们看到的任何错误,我将不胜感激。