以下是與WCF中繼的一個對比表:
站在用戶的角度思考問題,與客戶深入溝通,找到涉縣網(wǎng)站設(shè)計與涉縣網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋涉縣地區(qū)。
WCF中繼 | 混合連接 | |
建立本地和云之間的安全連接 | √ | √ |
無需修改防火墻添加入站端口 | √ | √ |
無需對網(wǎng)絡(luò)配置做重大修改 | √ | √ |
基于開放標(biāo)準(zhǔn)協(xié)議 | Χ(只支持WCF) | √ |
跨平臺支持 | Χ(只支持Windows) | √ |
多語言支持 | Χ(只支持.NET) | √ |
下面主要分三種情況來介紹混合連接的使用:
一. 基于混合連接SDK
二. 基于Azure Web App混合連接工具
三. 基于PortBridge示例程序
可以登陸Azure中國門戶網(wǎng)站,按照界面提示一步步創(chuàng)建。也可以通過PowerShell命令,如下。
# login to Azure China with your accountLogin-AzureRmAccount -Environment AzureChinaCloud$rgName = "relaydemorg"$namespaceName = "relaydemons"$location = "China East"$hcName = "hcdemo"New-AzureRmResourceGroup -Name $rgName -Location $locationNew-AzureRmRelayNamespace -ResourceGroupName $rgName -Name $namespaceName -Location $locationNew-AzureRmRelayHybridConnection -Namespace $namespaceName -ResourceGroupName $rgName -Name $hcName -RequiresClientAuthorization $true
創(chuàng)建出來混合連接字符串就是sb://relaydemons.servicebus.chinacloudapi.cn/hcdemo
目前微軟官方提供了兩個SDK,一個是.NET語言版本,另一個是Node.JS版本。兩個SDK也都開源在Github上:azure-relay-net,azure-relay-node。
首先本地服務(wù)端作為監(jiān)聽者,需要要使用具有監(jiān)聽權(quán)限的連接字符串,創(chuàng)建一個出站的WebSocket連接,也就是注冊到Azure中繼服務(wù)上。如果本地有多個監(jiān)聽者,那么進(jìn)入的訪問請求會隨機(jī)地發(fā)送。一個混合連接最多支持25個監(jiān)聽者。
private const string ConnectionString = "connection string with listen permission";// Listenvar listener = new HybridConnectionListener(ConnectionString);await listener.OpenAsync();// AcceptHybridConnectionStream relayConnection = await listener.AcceptConnectionAsync();// Readvar reader = new StreamReader(relayConnection);var line = await reader.ReadLineAsync();// OutputConsole.WriteLine(line); // Closeawait relayConnection.CloseAsync(CancellationToken.None);
發(fā)送者提供具有發(fā)送權(quán)限的連接字符串(不是必須如果建立混合連接時沒有要求客戶端認(rèn)證,不過從安全角度考慮,推薦要求認(rèn)證),與混合連接服務(wù)建立WebSocket連接,最終會與一個監(jiān)聽者建立起連接,從而進(jìn)行溝通。
private const string ConnectionString = "connection string with send permission";// Connectvar client = new HybridConnectionClient(ConnectionString); HybridConnectionStream relayConnection = await client.CreateConnectionAsync();// Writevar writer = new StreamWriter(relayConnection) { AutoFlush = true };await writer.WriteLineAsync("hello from outside");// Closeawait relayConnection.CloseAsync(CancellationToken.None);
當(dāng)然,因為搭建的WebSocket是雙向通道,所以本地服務(wù)端也可以發(fā)送消息到外部服務(wù)端的。
前面提到需要用到不同權(quán)限的連接字符串,總共有三種權(quán)限管理,監(jiān)聽和發(fā)送,可以根據(jù)需要創(chuàng)建不同權(quán)限搭配的安全訪問策略,然后在它的具體界面里會自動生成相應(yīng)的連接字符串,直接復(fù)制使用即可,如下圖。
如果本地服務(wù)不能或者不希望被修改成調(diào)用SDK,比如云端Web App調(diào)用本地的Web Api或者SQL數(shù)據(jù)庫,那該如何使用混合連接呢?Azure Web App已經(jīng)整合里混合連接,可以很方便的配置,而不需要對本地服務(wù)做任何修改。
完整代碼示例可查看我的Github。
目前Azure中國還沒有支持混合連接的整合,不過已經(jīng)在路上了,應(yīng)該會很快就可上線。以下用Azure全球來演示,最終Azure中國也會是同樣的體驗。
登陸azure門戶網(wǎng)站,找到你的web app,在設(shè)置下面點擊網(wǎng)絡(luò),在展開的頁面中點擊“配置你的混合連接端節(jié)點”,打開頁面如下:
點擊“下載連接管理工具”下載,后面會用到。
點擊“添加混合連接”,在打開的頁面里面點擊添加,如下圖。填入相應(yīng)信息,其中名稱可以自定義,而端節(jié)點主機(jī)必須是運(yùn)行你本地服務(wù)的機(jī)器名稱,端節(jié)點端口也是本地服務(wù)所在端口。命名空間選擇前面已經(jīng)創(chuàng)建好的,也可以這里創(chuàng)建新的。
創(chuàng)建完成后,把前面下載的連接管理工具安裝在運(yùn)行本地服務(wù)的機(jī)器上。然后打開混合連接管理工具,點擊“Configure another Hybrid Connection”,這個時候會彈出登陸框,輸入你的azure訂閱賬戶登陸后,會顯示當(dāng)前訂閱中已有的混合連接,如下圖。
選擇配置了正確端節(jié)點的混合連接,然后點擊“Save”保存。這個混合連接就會將本地與云端web app建立起連接,狀態(tài)顯示為”Connected”。
這樣,在web app里面就可以通過”端節(jié)點名稱:端口“的方式來訪問本地的服務(wù)了。比如我這里演示的,我在本地運(yùn)行了一個web api服務(wù)(api/values)在16782端口,返回字符串”value from on-premises <本地機(jī)器名稱>”,然后通過混合連接,云端web app就可以很簡單的訪問本地服務(wù)了,代碼如下:
using (var httpClient = new HttpClient()) { var onPremSvcUri = "http://mc-allenl-01:16782/api/values"; using (var response2 = httpClient.GetAsync(onPremSvcUri).Result) { if (response2.IsSuccessStatusCode) { ViewBag.Message = $"{response2.Content.ReadAsStringAsync().Result}"; } } }
結(jié)果:
對于其他本地服務(wù),比如SQL服務(wù),也可以用同樣的方式連接。
如果外部服務(wù)不是用Azure Web App,又該如何使用混合連接呢?可以通過混合連接來實現(xiàn)端口轉(zhuǎn)發(fā),從而建立連接通道。微軟官方示例PortBridge正是演示了這種功能。接下來,我們用它來演示在云端虛擬機(jī)中的web應(yīng)用調(diào)用本地web api。
創(chuàng)建以本地服務(wù)所運(yùn)行的機(jī)器為名稱的混合連接(演示名稱mc-allenl-01),如何創(chuàng)建請參照文章最開始的PowerShell命令。并分別創(chuàng)建發(fā)送和監(jiān)聽權(quán)限的共享訪問策略。
將PortBridge下載并編譯,修改PortBridgeServerAgent.exe.config文件中portBridge相關(guān)配置,其中targetHost配置成本地服務(wù)所運(yùn)行的機(jī)器名稱,端口則為本地服務(wù)所在端口,本示例配置如下。然后將整個文件夾復(fù)制到本地服務(wù)所運(yùn)行的機(jī)器上,并雙擊PortBridgeServerAgent.exe運(yùn)行。
修改PortBridgeClientAgent.exe.config文件中portBridgeAgent的相關(guān)配置,其中targetHost設(shè)置成本地服務(wù)所運(yùn)行的機(jī)器名稱,localTcpPort設(shè)為你期望使用訪問的端口,remoteTcpPort則為本地服務(wù)所運(yùn)行的端口,本示例配置如下。將整個文件夾復(fù)制到Azure虛擬機(jī)中,并雙擊PortBridgeClientAgent.exe運(yùn)行。
在Azure虛擬機(jī)中訪問http://localhost:81/api/values,沒有運(yùn)行PortBridge之前是會失敗的,但開啟PortBridge,也就是通過混合連接建立通道之后,就會訪問成功,如下所示: