我正在开发一个基于web的应用程序,希望在该应用程序中显示特定查询的twitter流。用户确实需要刷新网页视图,它会自动加载推文。
到目前为止,我已经使用tweetinvi创建了一个简单的控制台应用程序,它读取tweets并在tweets上执行所有自定义逻辑。
接下来,我需要知道如何创建项目布局/基础设施,使我的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();
}
}
}
将一个名为"Hubs"的新文件夹添加到项目中,并添加一个新的SignalR Hub类(该类也应在Visual Studio的"新文件"对话框中作为模板提供)。
在项目中的任何地方创建一个名为"TwitterConnection"的新类。在这个类的构造函数中,完成您在控制台应用程序中使用Tweetinvi连接到Twitterneneneba API的所有操作。通常,当您在SignalR中从服务器向客户端广播数据时,您可以在Hub类中进行广播,但您可以通过使用GlobalHost.ConnectionManager.GetHubContext<HUBNAME>();
在Hub类别本身之外获得对SignalR集线器的引用,其中HUBNAME是集线器的名称。所以你的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代理和外部JavaScript文件的引用,SignalR 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>
您需要将实时数据推送到浏览器。使用SignalR。
SignalR是一个很好的ASP.NET库,它允许您编写实时web应用程序。它在底层使用Websockets,但对于较旧的浏览器有许多后备位置。教程链接