1

我正在开发一个基于 Web 的应用程序,我想在其中显示特定查询的 twitter 流。用户确实需要刷新网页视图,它会自动加载推文。

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

接下来,我需要知道如何创建项目布局/基础设施,以便我的 Web 应用程序在没有客户端交互的情况下获得恒定的提要。

4

2 回答 2

4

正如 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();
        }
    }
}

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

在项目中的任何位置创建一个名为“TwitterConnection”的新类。在此类的构造函数中,执行您在控制台应用程序中执行的所有操作,以使用 Tweetinvi 连接到 Twitter API。通常,当您在 SignalR 中将数据从服务器广播到客户端时,您可以在 Hub 类中执行此操作,但您可以通过使用GlobalHost.ConnectionManager.GetHubContext<HUBNAME>();HUBNAME 是您的集线器的名称,在集线器类本身之外获取对 SignalR 集线器的引用。所以你的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创建一个新任务来管理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>,新的推文将在收到时添加:

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

<div class="row">
    <div class="col-md-12">
        <ul class="tweets"></ul>
    </div>
</div>
于 2015-04-19T18:26:21.750 回答
3

您需要将实时数据推送到浏览器。使用SignalR

SignalR 是 ASP.NET 的优秀库,可让您编写实时 Web 应用程序。它在幕后使用Websockets,但对旧浏览器有许多后备位置。教程链接

于 2015-04-19T10:11:06.597 回答