2013-12-11 30 views
2

我開始與SignalR和我有一個情況,我將有一個SignalR站點將廣播消息到客戶端,但我也需要一個管理界面,將實際上觸發這些消息。管理頁面將調用服務器端方法,這些方法將反過來爲常規用戶調用客戶端Javascript方法。所以我想我可以設置兩個獨立的集線器(一個用於管理員,一個用於其他人),或者我可以在一個集線器中擁有方法,只能由管理員調用以檢查授權。抑制一些集線器或方法的代理生成

但除授權外,我希望SignalR不在生成的Javascript代理類中包含管理方法或管理中心,這樣我就不會宣傳它們的存在(再次 - 這不是唯一的安全性,我會檢查授權)。是否有一個屬性或屬性可以設置在單個集線器上或集線器內的方法中,以防止它們被包含在代理中(但仍然可以從Javascript中調用它們)?我知道你可以在你的HubConfiguration中設置EnableJavaScriptProxiesfalse,但這似乎是全球性的,我想保留我希望普通客戶端使用的東西的代理。

+0

不確定在SignalR生成器中是否存在等價物,但可以使用[ProxyAPI](http://blog.greatrexpectations。 com/2012/11/06/proxyapi-automatic-javascript-proxies-for-webapi-and-mvc /)作爲生成器,它可以讓你[ProxyExclude]方法 –

+1

一個選項是使用signalr.exe來生成代理在編譯時編輯輸出。 –

+0

@el_tone:是的,我也在想。對於這個特定的項目來說這可能不是太複雜(不是很大),但對於更復雜的項目來說,這將是一個巨大的痛苦。 –

回答

2

我們現在沒有從代理中排除特定方法的方法。你必須重新實現你自己的代理生成器,它基本上做我們在默認的impl中做的事情,但是知道一些屬性來跳過生成特定的方法。

我們可以設想在SignalR的未來版本中添加此項。如果您對此感到強烈,請在github上提出問題。

這裏是默認實現(如果我們創建更多的方法是虛擬的和非靜態的,這會更容易)。

https://github.com/SignalR/SignalR/blob/master/src/Microsoft.AspNet.SignalR.Core/Hubs/DefaultJavaScriptProxyGenerator.cs

+0

謝謝大衛。它看起來像是有用的東西。目前我可能只是抓住生成的代理,手動編輯它,然後添加回作爲靜態類。當然,如果我以後需要更換我的集線器,那會非常煩人。 –

7

有使用接口一招。由於代理會產生代理唯一的公共方法,你可以使用界面像這樣創造中心:如果您使用類型MyHub的對象

public class MyHub : Hub, IMyHub 
{ 
    void IMyHub.NotGeneratedOnClient() 
    { 
    } 

    public void GeneratedOnClient() 
    { 
    } 
} 

NotGeneratedOnClient方法將不可見,你只能使用界面對其進行訪問。由於方法不是公共代理生成器,它不會將其添加到客戶端代理

相關問題