無駄になるので、データベースをポーリングしたくありません。この問題に取り組むには、データの単一のエントリポイント(HTTP APIなど)を1つだけ開き、SignalRHubを介して接続されているすべてのクライアントに更新をブロードキャストします。Brad Wilsonは、このアプローチを示す非常にクールなプレゼンテーションを行っています。
Brad Wilson-ASP.NETWebAPIを主演するMicrosoftの最新のWebスタック
これは、データ入力にASP.NETWebAPIテクノロジを使用するこのアプローチのコードサンプルです。データストアにメモリ内ディクショナリを使用しますが、ここではデータストレージ技術は重要ではありません。
// This hub has no inbound APIs, since all inbound communication is done
// via the HTTP API. It's here for clients which want to get continuous
// notification of changes to the ToDo database.
[HubName("todo")]
public class ToDoHub : Hub { }
public abstract class ApiControllerWithHub<THub> : ApiController
where THub : IHub {
Lazy<IHubContext> hub = new Lazy<IHubContext>(
() => GlobalHost.ConnectionManager.GetHubContext<THub>()
);
protected IHubContext Hub {
get { return hub.Value; }
}
}
public class ToDoController : ApiControllerWithHub<ToDoHub> {
private static List<ToDoItem> db = new List<ToDoItem> {
new ToDoItem { ID = 0, Title = "Do a silly demo on-stage at NDC" },
new ToDoItem { ID = 1, Title = "Wash the car" },
new ToDoItem { ID = 2, Title = "Get a haircut", Finished = true }
};
private static int lastId = db.Max(tdi => tdi.ID);
// Lines removed for brevity
public HttpResponseMessage PostNewToDoItem(ToDoItem item) {
lock (db) {
// Add item to the "database"
item.ID = Interlocked.Increment(ref lastId);
db.Add(item);
// Notify the connected clients
Hub.Clients.addItem(item);
// Return the new item, inside a 201 response
var response = Request.CreateResponse(HttpStatusCode.Created, item);
string link = Url.Link("apiRoute", new { controller = "todo", id = item.ID });
response.Headers.Location = new Uri(link);
return response;
}
}
// Lines removed for brevity
}
Bradがデモしたアプリケーションの完全なソースコードも入手できます:https ://github.com/bradwilson/ndc2012 。
もう1つのオプションは、データが変更されるとすぐにデータベースに通知を送信させることです。次に、それを取得して、SignalRを介してブロードキャストできます。次に例を示します。
SignalRとSqlDependencyを使用したASP.NETのデータベース変更通知