2016-07-05 3 views
0

나는 드래그 가능한 항목이있는 일종의 데스크탑 형 웹 응용 프로그램을 가지고 있으며 모든 항목에 드래그 앤 드롭하면 새로운 일련 화 된 데이터로 db 업데이트를 보냅니다. 이제 한 사용자가 레이아웃을 변경할 때마다 로그인 한 모든 컴퓨터를 실시간으로 업데이트해야합니다.클라이언트의 Windows 사용자 이름으로 SignalR을 사용하여 특정 클라이언트로 데이터를 전송

어떻게 주변이 속성 만 사용자에게 데이터를 전송 갈 것 :

User.Identity.Name 

은 기본적으로는 다음과 비슷한 모습이 될 것입니다

this.Clients.WithWindowsName("windowsusername").sendData(data); 

답변

3

먼저, 당신은 창 이름을 보낼 필요 서버에. 그것이 Start() 호출에 포함되기 때문에 가장 빠른 방법은, 따라서 당신이 proxy.Invoke() 추가로 필요하지는 헤더로 클라이언트를 보내는 :

클라이언트 측

_connection = new HubConnection(_uri); 
_connection.Headers.Add("windowsName", "John"); 
await _connection.Start(); 

서버 측

"windowsName"헤더가 귀하의 신원이됩니다.

using Microsoft.AspNet.SignalR; 

namespace YourServer 
{ 
    public class UserIdProvider : IUserIdProvider 
    { 
     public string GetUserId(IRequest request) 
     { 
      return request.Headers.Get("windowsName"); 
     } 
    } 
} 

그리고 글로벌 의존성 해결에 연결 : 당신이 그것을 것 User.Identity.Name에 액세스 할 때마다

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var idProvider = new UserIdProvider(); 
     GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider),() => idProvider); 

     // TODO configure signalR here 
    } 
} 

SignalR이 ID로 해당 헤더를 인식하고 있는지 확인하려면 IUserIdProvider의 구현을 작성해야 "windowsName"과 일치하지만 아래 설명 된대로 필요하지 않습니다.

사용자가 말한 것처럼 사용자는 여러 컴퓨터에서 로그인 할 수 있습니다. 이 처리하는 가장 좋은 방법은 SignalR 그룹을 만드는 :

public override Task OnConnected() 
{ 
    var windowsName = Context.Headers.Get("windowsName"); 
    Groups.Add(Context.ConnectionId, windowsName); 

    return base.OnConnected(); 
} 

이것은 Windows 시스템의 이름으로 SignalR 그룹을 생성합니다. 사용자가 다른 컴퓨터에 로그인하면 동일한 그룹에 추가됩니다. OnDisconnected 안에있는 어떤 것도 제거 할 필요가 없습니다. 그 이유는 SignalR이 당신을 대신해서 처리 할 것이기 때문입니다. 그래서 단일 사용자에 대해도 그룹을 만들 잘 키우면

Clients.Group("John").sendData(data); 
Clients.Group(User.Identity.Name).sendData(data); 

가 (여러에서 연결 : 당신이 그룹에 메시지를 보낼 때마다, 연결된 모든 기계가 통지되기 때문에

그룹은 매우 편리합니다 기계).

+0

이것은 매우 유용합니다! 이 놀라운 답변과 매우 이해할 수있는 설명에 감사드립니다! 당신에게 좋은 일! – Bodokh