2017-11-01 8 views
0

私はSignalR(コアバージョン、現在1.0.0-alpha2-final)を初めて使いました。 私はコントローラアクションからレンダリングされたビューを持っており、ページはリロードせずにいくつかのAPIとやりとりします。他の(APIスタイル)コントローラメソッドからページの一部を更新して、何も返さないようにしたいと思います。 したがって、インデックスビューはコントロールを含むページをレンダリングし、SignalRにも接続します。私が持っているもの.Net Core 2/SignalR:現在接続されているAPIクライアントをコントローラから解決します。

は、メッセージのプレースホルダとして

<div id="DisplayMessages"></div> 

です。

私のコントローラには、IHubContextの依存性注入があります。

let connection = new signalR.HubConnection("/signalr", { transport: signalR.TransportType.LongPolling }); 

connection.on('send', 
    data => { 
     var DisplayMessagesDiv = document.getElementById("DisplayMessages"); 
     DisplayMessagesDiv.innerHTML += "<br/>" + data; 
    }); 
connection.onClosed = e => { 
    console.log('connection closed'); 
};  
connection.start().then(() => connection.invoke('send', 'Hello')); 

function SendMessage() { 
    var msg = document.getElementById("txtMessage").value; 
    connection.invoke('send', msg); 
} 

私は唯一の最初に、今に送信するページをレンダリングし、それをクライアントに送信する方法を見つけ出すことはできませんどのような

public JsonResult DoSomething([FromBody] DoSomethingParameters parameters) 
     doSomething(); 
     _signalRHub.Clients.All.InvokeAsync("Send", "Did something with " + parameters.SomeParameter); 

ように私のコントローラメソッドの内部からすべてのクライアントにメッセージを送信することができますAPI。サンプルには、ユーザーのIDにマップする例がありますが、ページは匿名ユーザーによってレンダリングできるため、無用です。彼のブラウザがSignalRに接続されている間に、APIを要求しているクライアントの接続IDをどのように受け取ることができますか?

ありがとうございました!

+0

を、それはおそらく不可能です。私は今、ユーザーの名前でグループを作成することで自分自身を助けました。グループはIHubContextから入手できます。 – ExternalUse

+1

接続を開始するために使用するクエリ文字列に任意の値を渡すこともできます。これを使用して、サーバー上で使用して、更新を送信するクライアントを識別できる一意のユーザーIDを提供することができます。 – Pawel

+1

こんにちはPawel、問題は、私はAPIコールを生成するコンポーネントのいくつかを制御できないため、実際にコンポーネントを表示しているページから発信されるコンポーネントの呼び出しを必ずしも識別できないということです。ビットは私が推測するのは難しい。私が言及したグループ方法は幸いに働く。 – ExternalUse

答えて

0

ハブの接続IDはハブ内でのみ利用可能で、私が現在使っているものを使用するためにサイト全体の匿名ユーザーを追跡する努力が必要なので、コメントに記載されているように、私は答えはないと思いますやって コンポーネントは認可を必要とするため、ハブに接続するときにユーザーの名前でグループを作成しています。

public override Task OnConnectedAsync() 
{ 
    Groups.AddAsync(Context.ConnectionId, Context.User.Identity.Name); 
    return base.OnConnectedAsync(); 
} 

これは私が注入さhubcontext

private readonly IHubContext<SignalRHub> _signalRHub; 

public FooController(IHubContext<SignalRHub> signalRHub) 
{  
    _signalRHub = signalRHub; 
} 

とメソッドからアクセスしてアクセスすることができます。もう一度を介してこれを考えた後

_signalRHub.Clients.Group(User.Identity.Name).InvokeAsync("Send", User.Identity.Name + ": Message for you"); 
関連する問題