2017-08-13 54 views
0

我有一個由網關和幾個後端服務組成的Web應用程序。 網關是一個自託管的OWIN應用程序,涵蓋諸如身份驗證,授權以及將API調用路由到後端的問題。SignalR簡單網關

我有興趣在我的後端服務之一中使用SignalR來將數據推送到客戶端。例如。用戶啓動長時間運行的查詢,並在數據可用時反饋給客戶端。

我設法利用從橫向擴展的文章作爲一個傳遞機制的背板(雖然現在看來,這不是爲這樣的消息) SignalR scaleout explanation

「網關」樞紐代碼:(邏輯僅用於測試目的)

public override async Task OnConnected() 
    { 
     HttpClient client = new HttpClient() 
     { 
      BaseAddress = new Uri("http://localhost:8888/other/") 
     }; 

     var result = await client.PostAsJsonAsync("signin", Context.ConnectionId); 

     await base.OnConnected(); 
    } 

後端控制器代碼

[HttpPost] 
    [Route("signin")] 
    public void PostSignin([FromBody]string id) 
    { 
     StartPing(id); 
    } 

    public async Task StartPing(string id) 
    { 
     var context = GlobalHost.ConnectionManager.GetHubContext<FrontendHub>(); 

     int i = 0; 
     while (true) 
     { 
      i++; 
      context.Clients.Client(id).showMessage("num " + i); 
      await Task.Delay(1000); 
     } 
    } 

但是,這是一個很大的企業應用程序,我不希望網關對後端服務的實際代碼有任何依賴性。但是該示例僅在網關和後端服務中定義了具有相同名稱的集線器時才起作用。另一方面,我想避免在網關中放置這樣的專用代碼的需要,另一方面,我想利用能夠使用實際函數名稱和參數的能力。我不想要一個具有單一功能的「主中心」。

有沒有辦法做到這一點?

回答

0

最終沒有做完這一切,但後來發現的解決方案確實使用了「主集線器」,但它實際上並不需要任何功能。

該合同位於後端服務和客戶端應用程序之間。由於SignalR中的所有內容都是鬆散類型的,因此客戶機在集線器上定義一些功能就足夠了,後端服務在集線器上調用相同的功能。集線器實際上並不需要它自己的代碼中的這個功能。