LinqToTwitter 搜索从不 Returns

LinqToTwitter Search Never Returns

我正在尝试使用 LinqToTwitter 搜索 Twitter。它在 NUnit 测试中作为 运行 工作正常,但它不适用于 ASP.NET 或作为 WinForm 应用程序。我不确定要使用什么授权方。

public async Task<Search> SearchTwitter(string searchWords)
{
    var twitterCtx = BuildTwitterContext();

    Task<Search> searchResponse = (from search in twitterCtx.Search
                                   where search.Type == SearchType.Search &&
                                         search.Query == searchWords
                                   select search)
        .SingleOrDefaultAsync();

    return await searchResponse;
}

private static TwitterContext BuildTwitterContext()
{
    IAuthorizer authorizer;

    if (HttpContext.Current == null)
        authorizer = new PinAuthorizer();
    else
        authorizer = new AspNetSignInAuthorizer();

    InMemoryCredentialStore credentialStore = new InMemoryCredentialStore();
    credentialStore.ConsumerKey = consumerKey;
    credentialStore.ConsumerSecret = consumerSecret;
    credentialStore.OAuthToken = accessToken;
    credentialStore.OAuthTokenSecret = accessTokenSecret;
    authorizer.CredentialStore = credentialStore;
    var twitterCtx = new TwitterContext(authorizer);
    return twitterCtx;
}

ASP.NET 的不同之处在于页面重定向,您在此处开始授权,然后在 Twitter 重定向回来后完成。以下是 LINQ to Twitter 文档,它将解释 OAuth 的工作原理并让您更好地了解使用哪些授权方:

https://github.com/JoeMayo/LinqToTwitter/wiki/Learning-to-use-OAuth

L2T源码也有demo。这是一个 OAuth 控制器演示:

https://github.com/JoeMayo/LinqToTwitter/blob/master/New/Linq2TwitterDemos_Mvc/Controllers/OAuthController.cs

public class OAuthController : AsyncController
{
    public ActionResult Index()
    {
        return View();
    }

    public async Task<ActionResult> BeginAsync()
    {
        //var auth = new MvcSignInAuthorizer
        var auth = new MvcAuthorizer
        {
            CredentialStore = new SessionStateCredentialStore
            {
                ConsumerKey = ConfigurationManager.AppSettings["consumerKey"],
                ConsumerSecret = ConfigurationManager.AppSettings["consumerSecret"]
            }
        };

        string twitterCallbackUrl = Request.Url.ToString().Replace("Begin", "Complete");
        return await auth.BeginAuthorizationAsync(new Uri(twitterCallbackUrl));
    }

    public async Task<ActionResult> CompleteAsync()
    {
        var auth = new MvcAuthorizer
        {
            CredentialStore = new SessionStateCredentialStore()
        };

        await auth.CompleteAuthorizeAsync(Request.Url);

        // This is how you access credentials after authorization.
        // The oauthToken and oauthTokenSecret do not expire.
        // You can use the userID to associate the credentials with the user.
        // You can save credentials any way you want - database, 
        //   isolated storage, etc. - it's up to you.
        // You can retrieve and load all 4 credentials on subsequent 
        //   queries to avoid the need to re-authorize.
        // When you've loaded all 4 credentials, LINQ to Twitter will let 
        //   you make queries without re-authorizing.
        //
        //var credentials = auth.CredentialStore;
        //string oauthToken = credentials.OAuthToken;
        //string oauthTokenSecret = credentials.OAuthTokenSecret;
        //string screenName = credentials.ScreenName;
        //ulong userID = credentials.UserID;
        //

        return RedirectToAction("Index", "Home");
    }
}

请注意,它使用 WebAuthorizer/SessionStateCredentials 对并使用单独的操作方法(通过回调指定)将授权开始分开以完成。

以下演示展示了如何在 WinForms 应用程序中执行 OAuth:

https://github.com/JoeMayo/LinqToTwitter/blob/master/New/Demos/Linq2TwitterDemos_WindowsForms/OAuthForm.cs

public partial class OAuthForm : Form
{
    PinAuthorizer pinAuth = new PinAuthorizer();

    public OAuthForm()
    {
        InitializeComponent();
    }

    async void OAuthForm_Load(object sender, EventArgs e)
    {
        pinAuth = new PinAuthorizer
        {
            // Get the ConsumerKey and ConsumerSecret for your app and load them here.
            CredentialStore = new InMemoryCredentialStore
            {
                ConsumerKey = ConfigurationManager.AppSettings["consumerKey"],
                ConsumerSecret = ConfigurationManager.AppSettings["consumerSecret"]
            },
            // Note: GetPin isn't used here because we've broken the authorization
            // process into two parts: begin and complete
            GoToTwitterAuthorization = pageLink => 
                OAuthWebBrowser.Navigate(new Uri(pageLink, UriKind.Absolute))
        };

        await pinAuth.BeginAuthorizeAsync();
    }

    async void SubmitPinButton_Click(object sender, EventArgs e)
    {
        await pinAuth.CompleteAuthorizeAsync(PinTextBox.Text);
        SharedState.Authorizer = pinAuth;

        // This is how you access credentials after authorization.
        // The oauthToken and oauthTokenSecret do not expire.
        // You can use the userID to associate the credentials with the user.
        // You can save credentials any way you want - database, isolated storage, etc. - it's up to you.
        // You can retrieve and load all 4 credentials on subsequent queries to avoid the need to re-authorize.
        // When you've loaded all 4 credentials, LINQ to Twitter will let you make queries without re-authorizing.
        //
        //var credentials = pinAuth.CredentialStore;
        //string oauthToken = credentials.OAuthToken;
        //string oauthTokenSecret = credentials.OAuthTokenSecret;
        //string screenName = credentials.ScreenName;
        //ulong userID = credentials.UserID;
        //

        Close();
    }
}

在这种情况下,您可以将 PinAuthorizer 与 InMemoryCredentialStore 一起使用。如果您查看该演示,它使用 Web 浏览器控件导航到 Twitter 并管理 OAuth 流程。

查看上面的 URL 学习使用 OAuth,了解您可以在不同场景中使用的其他 IAuthorizer 派生类型的示例。此外,下载源代码并逐步使用调试器来感受 OAuth 工作流。