サーバー側のイベントをWebサイトに渡すことができるデザインパターンがあるかどうか疑問に思っていますか?
私が考えることができる最善の方法は、イベントがトリガーされたときに更新されるサーバー上の状態を持っていることです。その後、ajaxを介してサーバーに頻繁にコールバックし、状態を確認して、必要なものを返します。これは適切ですか?これを行うためのより良い方法はありますか?
私のアプリケーションはASP.NETMVC4で書かれています。
サーバー側のイベントをWebサイトに渡すことができるデザインパターンがあるかどうか疑問に思っていますか?
私が考えることができる最善の方法は、イベントがトリガーされたときに更新されるサーバー上の状態を持っていることです。その後、ajaxを介してサーバーに頻繁にコールバックし、状態を確認して、必要なものを返します。これは適切ですか?これを行うためのより良い方法はありますか?
私のアプリケーションはASP.NETMVC4で書かれています。
どのように取り組みたいか、スタックに導入したい技術に応じて、これを処理する方法がいくつかあります。
まず、サーバーの現在の状態を報告するサーバー上のコントローラー メソッドへの定期的な ajax 呼び出しは、まったく問題ありません。たとえば、長時間実行されているタスクがサーバーで開始された場合、コントローラー メソッドとそのメソッドを定期的にポーリングすることは完全に合理的です。
もう 1 つの方法は、SignalR と呼ばれるテクノロジを使用することです。これにより、サーバーはクライアントで JavaScript 関数を呼び出すことができます。検討することをお勧めします。
小さな例:
サーバ:
public class Chat : Hub
{
public void Send(string message)
{
// Call the addMessage method on all clients
Clients.All.addMessage(message);
}
}
クライアント:
<script src="http://code.jquery.com/jquery-1.8.2.min.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR-1.0.0-alpha2.min.js" type="text/javascript"></script>
<!-- If this is an MVC project then use the following -->
<!-- <script src="~/signalr/hubs" type="text/javascript"></script> -->
<script src="/signalr/hubs" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
// Proxy created on the fly
var chat = $.connection.chat;
// Declare a function on the chat hub so the server can invoke it
chat.client.addMessage = function (message) {
$('#messages').append('<li>' + message + '</li>');
};
$("#broadcast").click(function () {
// Call the chat method on the server
chat.server.send($('#msg').val());
});
// Start the connection
$.connection.hub.start();
});
</script>
<div>
<input type="text" id="msg" />
<input type="button" id="broadcast" value="broadcast" />
<ul id="messages">
</ul>
</div>
上記の例は、 https ://github.com/SignalR/SignalR/wiki/QuickStart-Hubs から取得したものです。
SignalR の Web サイトは次の場所にあります: http://signalr.net/
私は SignalR が大好きです...おそらく、プログラマーとユーザーの両方に最高のエクスペリエンスを提供してくれるでしょう。
お役に立てれば。
SignalRプロジェクトを見ているように聞こえます。これにより、双方向のサーバー通信が可能になります。
ロングポーリング/コメットを使用してサーバーイベントを待つことができます。これは、ajaxリクエストをサーバーに送信する必要があり、ajaxリクエストが一度に実行されないことを意味し、リクエストはタイムアウトになるまでサーバーイベントを待ちます。
または、次のように、signalR フレームワークなしで、次のような ajax コール サーバー イベントを使用してサーバーのイベントをリッスンすることもできます。
[SessionState(SessionStateBehavior.ReadOnly)]
public class HomeController : Controller
{
static readonly ManualResetEvent Starter = new ManualResetEvent(false);
public ActionResult Index()
{
return View();
}
public String RiseServerEvent()
{
Starter.Set();
return "";
}
public async Task<String> WaitForServerEvent()
{
string contents = null;
var result = Task.Factory.StartNew(() =>
{
var reg = ThreadPool.RegisterWaitForSingleObject
(Starter, (state, @out) =>
{
contents = DateTime.Now.TimeOfDay.ToString();
}, "Some Data", -1, true);
Starter.WaitOne(10000);
contents = DateTime.Now.TimeOfDay.ToString();
});
await result;
return contents;
}
}