0

サーバー側のイベントをWebサイトに渡すことができるデザインパターンがあるかどうか疑問に思っていますか?

私が考えることができる最善の方法は、イベントがトリガーされたときに更新されるサーバー上の状態を持っていることです。その後、ajaxを介してサーバーに頻繁にコールバックし、状態を確認して、必要なものを返します。これは適切ですか?これを行うためのより良い方法はありますか?

私のアプリケーションはASP.NETMVC4で書かれています。

4

3 に答える 3

2

どのように取り組みたいか、スタックに導入したい技術に応じて、これを処理する方法がいくつかあります。

まず、サーバーの現在の状態を報告するサーバー上のコントローラー メソッドへの定期的な 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 が大好きです...おそらく、プログラマーとユーザーの両方に最高のエクスペリエンスを提供してくれるでしょう。

お役に立てれば。

于 2012-11-27T11:00:05.783 に答える
1

SignalRプロジェクトを見ているように聞こえます。これにより、双方向のサーバー通信が可能になります。

于 2012-11-27T10:54:42.567 に答える
0

ロングポーリング/コメットを使用してサーバーイベントを待つことができます。これは、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;
        }

    }
于 2012-11-27T12:10:41.157 に答える