10

WebAPI ApiController から SignalR ハブを呼び出す方法がわかりません。ここからダウンロードできるサンプルをまとめて、問題を単純化し、問題を示します。

  1. ASP.NET MVC WebAPI テンプレートから新しいプロジェクトを作成しました。
  2. ChatHub というプロジェクトに新しい SignalR Hub を追加しました。
  3. 読み込み時に ChatHub に接続し、グループに参加して、そのグループにメッセージを送信する HTML ページを追加しました。これはうまくいきます。
  4. HTML ページには、クリックすると ValuesController の post メソッドへの ajax 呼び出しを起動するボタンもあります。ValuesController の post メソッドで、グループに接続されているすべてのクライアントにメッセージをブロードキャストしたいと考えています。これを機能させることはできません。

メソッドが 2 つだけの単純な SignalR ハブがあります。

[HubName("chat")]
public class ChatHub : Hub
{
    public void Join(string room)
    {
        // NOTE: this is not persisted - ....
        Groups.Add(Context.ConnectionId, room);
    }

    public void Send(string room, string message)
    {
        var msg = String.Format(
            "{0}: {1}", Context.ConnectionId, message);
        Clients.Group(room).newMessage(msg);
    }
}

ここに示すように、DOM の準備ができたときにチャット ハブに接続する非常に単純な HTML ページを作成しました。

<html>
<head>
    <title>Simple Chat</title>
    <script src="Scripts/jquery-1.8.2.js" type="text/javascript"></script>
    <script src="Scripts/jquery.signalR-1.0.0.js"></script>
    <script src="signalr/hubs"></script>
    <script type="text/javascript">
        var chat;

        //$(function () {
        //    connectToHubs();
        //});
        $(connectToHubs);
        function connectToHubs() {
            $.connection.hub.logging = true;

            chat = $.connection.chat;
            chat.client.newMessage = onNewMessage;

            $.connection.hub.start({ transport: 'longPolling' }).done(function () {
                chat.server.join("TestGroup").done(function () {
                    chat.server.send("TestGroup", "message from html");
                });
            });

            $('#controller').click(postProficiencyUserAction);



        }
        var postProficiencyUserAction = function () {
            //var token = $('[name=__RequestVerificationToken]').val();
            var headers = {};
            //headers["__RequestVerificationToken"] = token;
            //var userAction = { createdOn: "2013-05-21T00:00:00", userId: "12345678-1234-1234-1234-000000000001", actionId: "12345678-1234-1234-1234-000000000003" };
            $.ajax({
                type: 'POST',
                url: 'http://localhost:58755/api/values',
                cache: false,
                headers: headers,
                contentType: 'application/json; charset=utf-8',
                data: 'test',
                dataType: "json",
                success: function () {

                },
                error: function () {

                }
            });
        };
        function onNewMessage(message) {
            // ... todo: validation !!!! :)
            $('#messages').append('<li>' + message + '</li>');
        };

    </script>
</head>
<body>
    <div>
        <h2>Chat</h2>
        <input type="button" id="controller" value="Controller Method" />
        <div>
            <h2>Message(s) Received</h2>
            <ul id="messages"></ul>
        </div>
    </div>
</body>
</html>

派手なものはありません。接続されたハブが新しい​​メッセージを受信するたびに、新しい項目が順不同リストに追加されます。ValuesController post メソッドへの Ajax 呼び出しを行うボタンがあります。

public class ValuesController : ApiController
{
    // POST api/values
    public void Post([FromBody]string value)
    {
        var hubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
        hubContext.Clients.Group("TestGroup").send("TestGroup", "Called from Controller");
    }

ハブ呼び出しが機能しません。エラーはスローされませんが、メッセージは受信されません。ハブの「送信」メソッドにブレークポイントを配置しても機能しません。私はそれを正しくやっているように感じます。誰か助けて?繰り返しますが、ソースコードはここにあります

4

1 に答える 1

16

クライアントでさまざまなメソッドを呼び出しています:

API コントローラー

hubContext.Clients.Group("TestGroup").send("TestGroup", "Called from Controller");

ハブ

Clients.Group(room).newMessage(msg);

呼び出したいメソッドは newMessage not send です

chat.client.newMessage = onNewMessage;
于 2013-05-22T16:28:03.107 に答える