2016-07-30 2 views
4

애플리케이션을 개발하고 서버 측 기술은 asp.net 웹 API이며 클라이언트 측은 javascript입니다. 내 응용 프로그램에서는 Signalr을 사용하여 클라이언트에 업데이트를 알립니다. 즉, 서버에서 클라이언트로 알림을 푸시합니다.신호를 웹 API와 통합하여 클라이언트에 알립니다.

모든 신호 상호 작용은 HTTP 요청에서 발생하는 푸시 (push)와 클라이언트가 signalr을 통해 서버로 푸시하는 것이 아니기 때문에 Hub 클래스 외부에서 발생합니다.

성공적인 HTTP 요청을 처리 한 후 요청을 보낸 사람 옆에있는 모든 클라이언트가 요청하도록합니다.

누가 이러한 알림을 담당해야합니까? 법적 요청을 처리 한 후 내 서버가 클라이언트에 알림을 전송해야합니까? (이것은 내가 지금하는 일입니다.) 이것이 방법 일 경우 요청을 한 사람 외에 모든 고객에게 어떻게 알릴 수 있습니까? Reminder - 요청이 Http이고 signalr push가 아니기 때문에 클라이언트 측에 대한 푸시는 허브 외부의 클래스에서 발생합니다. 따라서 컨텍스트 또는 Client.Others 속성을 사용하면 좋습니다. 어떤 클라이언트에게 통지해야하는지 어떻게 알 수 있습니까? 그 순간 나는 단지 클라이언트 만 사용합니다. 요청을 한 사람은 누구나 내가 좋아하지 않는 것도 알립니다.

옵션 2는 내 서버가 성공 상태 코드로 응답 한 후입니다. 요청을 한 클라이언트는 다른 클라이언트에게 알릴 책임이 있습니다. 즉, 메시지를 서버에 보내고 서버가 모든 다른 클라이언트에게이 알림을 푸싱합니다 (이번에는 신호 허브 내에있게 될 것입니다. 고객).

어떤 방법을 사용해야합니까?

답변

3

나는 첫 번째 접근 방식이 원활하고 구현하기가 쉽다고 생각합니다. 또한 사용자는 알림을 담당하는 사용자를 원하지 않습니다. 사용자는 게으르다.

기본적으로 요청을 처리하고 예외가 발생하지 않은 경우 SignalR 허브 컨텍스트를 얻고 내장 된 SignalR C# API를 사용하여 클라이언트 을 제외한 모든 클라이언트에게 메시지를 브로드 캐스트합니다 보낸 사람.

[Route("ProcessMessage")] 
    public async void ProcessMessage(string[] clientConnectionStrings) 
    { 
     // do some processing 
     var hub = GlobalHost.ConnectionManager.GetHubContext<MessagingHub>(); 

     hub.Clients.AllExcept(clientConnectionStrings); 
    } 

당신은 AllExcept를 사용하는 클라이언트의 연결 ID를 전달해야하지만 상당히 쉽게 통합 할 수 있어야한다 :

은 여기 Controller에 갈 것 몇 가지 코드입니다. (참고 : SignalR 허브와 직접 상호 작용 한 경우이 작업을 수행 할 필요가 없습니다 것)

참고 : 브로드 캐스트에서 제외 할 클라이언트의 연결을 얻으려면, 당신은 그것을 좋아에 액세스 할 수 있습니다

$.connection.hub.id

SignalR 허브를 직접 사용할 수도 있지만 허브 서버에서 이벤트를 트리거하려면 추가 JavaScript 코드가 필요합니다.

$.ajax({ 
     url: 'Some/Url/', 
     type: 'POST', 
     success: function (data) { 
       connection.server.someDataChangeEvent(); 
     }, 
     error: function (ex) { return; } 
    }); 

SignalR 허브 코드 :

public void SomeDataChangeEvent(string connId) 
{ 
    Clients.Others.updateData(_someDataStore.getUpdates().ToList()); 
} 

클라이언트 코드 : 예를 들어

connection.client.updateData = function() { 
    //do stuff 
} 
+0

이 옵션을 선택하면, 나는 또 다른 매개 변수를 사용하기 위해 내 모든 요청을 변경해야합니다 - 고객 ID?그렇게 할 수있는 더 좋은 방법이 있습니까? 모든 작업 및 테스트 된 API를 변경하고 싶지 않을 것입니다. –

+0

내 업데이트를 확인하십시오. –

+0

당신의 코드가 제 2의 옵션을 설명한다고 생각합니다 - 요청이 성공한 후에 클라이언트 쪽에서 밀어 넣기를 할 수 있습니까? –

관련 문제