我正在基于Web的应用程序上工作,在该应用程序中我想在特定查询中显示Twitter流。用户确实需要刷新网页视图,它将自动加载推文。

到目前为止,我已经使用tweetinvi创建了一个简单的控制台应用程序,该应用程序读取tweeet并在tweet上执行所有自定义逻辑。

接下来,我需要知道如何创建项目布局/基础结构,以便Web应用程序能够在不与客户端交互的情况下获取恒定的提要。

最佳答案

正如Nathan Cooper所指出的,SignalR是实现这一目标的最佳方法。正如我刚刚建立的您所描述的内容一样,我将为您详细介绍您需要做的事情。

创建一个新的ASP.NET MVC项目,并使用NuGet和Tweetinvi安装ASP.NET SignalR

右键单击App_Start文件夹并添加一个新的OWIN Startup类(如果您已使用NuGet安装SignalR,则应在上下文菜单中列出该类)。

您的OWIN启动类应如下所示:

[assembly: OwinStartup(typeof(TwitterClient.Web.App_Start.Startup))]

namespace TwitterClient.Web.App_Start
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}


将一个新的Folder添加到名为“ Hubs”的项目中,并添加一个新的SignalR Hub类(在Visual Studio的新文件对话框中,它也应作为模板提供)。

在项目中的任何地方创建一个名为“ TwitterConnection”的新类。在此类的构造函数中,完成您在控制台应用程序中所做的所有工作,以使用Tweetinvi连接到Twitter API。通常,当您在SignalR中从服务器向客户端广播数据时,您可以在Hub类中进行操作,但是可以使用GlobalHost.ConnectionManager.GetHubContext<HUBNAME>();在Hub类本身之外获取对SignalR Hub的引用,其中HUBNAME是您的Hub名称。因此,您的TwitterConnection类应如下所示:

public class TwitterConnection {
        private string _consumerKey = ConfigurationManager.AppSettings.Get("consumerKey");
        private string _consumerSecret = ConfigurationManager.AppSettings.Get("consumerSecret");
        private string _accessKey = ConfigurationManager.AppSettings.Get("accessToken");
        private string _accessToken = ConfigurationManager.AppSettings.Get("accessTokenSecret");

        private IHubContext _context = GlobalHost.ConnectionManager.GetHubContext<TwitterHub>();

        public TwitterConnection()
        {
            // Access the filtered stream
            var filteredStream = Stream.CreateFilteredStream();

            filteredStream.MatchingTweetReceived += (sender, args) =>
            {
                _context.Clients.All.broadcast(args.Tweet.Text);
            };

            filteredStream.StartStreamMatchingAllConditions();

        }
}


在服务器端方面,您需要找到一种确保在任何时候都只有一个流实例可以向Twitter打开的方法。我执行此操作的快速而肮脏的方法是使用Task.Factory.StartNew创建一个新的Task来设法在Global.asax文件中进行流传输:

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            // Start a new instance of the TwitterConnection class
            Task.Factory.StartNew(() => new TwitterConnection());
        }


最后,您需要连接SignalR的客户端元素。在您的MVC布局视图(即Views/Shared/_Layout.cshtml)中,在HTML标记底部的引用中添加到SignalR JavaScript库,生成的Hub代理以及您的样板SignalR JavaScript将会在其中使用的外部JavaScript文件:

<!--Reference the SignalR library. -->
<script src="../../Scripts/jquery.signalR-2.2.0.min.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="signalr/hubs"></script>
<script src="../../Scripts/application.js"></script>


最后,您在application.js中的样板代码(或任何您想调用的代码)将如下所示:

// document ready shorthand
$(function () {
    // obtain reference to the hub proxy and hub itself
    var theHub = $.connection.twitterHub;


    // this is the function that the server will call to broadcast new tweets
    theHub.client.broadcast = function (tweet) {
        var item = '<li>' + tweet.text + '</li>';
        $('ul.tweets').prepend(item);
    };

    // this is a function that indicates that connection to the hub has been successful
    $.connection.hub.start().done(function () {
        console.log("connected");
    });
});


您的Index.cshtml文件中只会有一个空的<ul>,新的tweet会在收到这些消息之前预先添加:

@{
    ViewBag.Title = "Home Page";
}

<div class="row">
    <div class="col-md-12">
        <ul class="tweets"></ul>
    </div>
</div>

关于c# - 流实时推文到我的.net网站,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29727083/

10-11 00:58