2

誰でも私が理解するのを手伝ってくれますか

SignalR を使用してサーバー メソッドからクライアント メソッドを呼び出す方法 サーバー クラスは、別のアセンブリの CustomEvent ハンドラーに存在します。

メソッドを呼び出すために3つの異なる方法を試しました:

ハブに [HubName("notificationhub")] という名前を付けました

方法1

Clients.addMessage(message);

これにより、「null 参照に対してランタイム バインディングを実行できません」というメッセージが表示されます。

方法 2

IHubContext context1 = GlobalHost.ConnectionManager.GetHubContext("notificationhub");
context1.Clients.addMessage('hello');

クライアントは黙っていた。

方法3

var hubConnection = new HubConnection("http://localhost:21120/");
var notification= hubConnection.CreateProxy("notificationhub");
hubConnection.Start().Wait();
notification.Invoke("Send", "Hello").Wait();

このメソッドはエラーを返します: {"リモート サーバーがエラーを返しました: (500) 内部サーバー エラー"} 驚いたことに、3 番目のメソッドを使用してコンソール アプリケーションからこのメソッドを呼び出すことができます。

これを実装するための最良の解決策は何ですか?また、クライアント メソッドを呼び出すことができない理由は何ですか? 誰でもこれで私を助けることができますか?

よろしくビンス

4

1 に答える 1

0

これが私がやっている方法です。少しハックですが、機能します。コントローラーからハブを呼び出す場合にのみ機能します。それ以外の場合は機能しません。UpdateHubFromController メソッドを使用します。

public class UpdateFeedActivity : Hub
{
    readonly IHubContext _hubContext ;

    public UpdateFeedActivity()
    {
        _hubContext = _hubContext ?? GlobalHost.ConnectionManager.GetHubContext<UpdateFeedActivity>();
    }

    public void UpdateFeed(string groupname, string itemId, Enums.FeedActivityTypes activityType,
                                                                               string userId="",
                                                                               string actionResult1="", 
                                                                               string actionResult2="", 
                                                                               string actionResult3="")
    {
       Clients.Group(groupname).updateMessages(new FeedHubResponse
                                              {
                                                  ItemId = itemId,
                                                  ActivityType = activityType.ToString(),
                                                  UserId = userId,
                                                  ActionResult1 = actionResult1,
                                                  ActionResult2 = actionResult2,
                                                  ActionResult3 = actionResult3
                                              });
    }

    public void UpdateFeedFromController(string groupname, string itemId, Enums.FeedActivityTypes activityType,
                                                                               string userId = "",
                                                                               string actionResult1 = "",
                                                                               string actionResult2 = "",
                                                                               string actionResult3 = "")
    {
        _hubContext.Clients.Group(groupname).updateMessages(new FeedHubResponse
        {
            ItemId = itemId,
            ActivityType = activityType.ToString(),
            UserId = userId,
            ActionResult1 = actionResult1,
            ActionResult2 = actionResult2,
            ActionResult3 = actionResult3
        });
    }



    public void Join(string groupname)
    {
        Groups.Add(Context.ConnectionId, groupname);  
    }
}

public class FeedHubResponse
{
    public string ItemId { get; set; }
    public string UserId { get; set; }
    public string ActionResult1 { get; set; }
    public string ActionResult2 { get; set; }
    public string ActionResult3 { get; set; }
    public string ActivityType { get; set; }
    public string Text { get; set; }
}
于 2013-03-15T16:10:34.967 に答える