2013-10-11 82 views
1

我想要一個簡單的WebSocket服務器去使用SignalR,OWIN和Azure工作者角色。不能簡單的SignalR Azure工作者角色工作

WorkerRole.cs:

public class WorkerRole : RoleEntryPoint 
{ 
    public override void Run() 
    { 
     string url = "http://" + RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["MyEndpoint"].IPEndpoint; 
     using (WebApp.Start<Startup>(url)) 
     { 
      Trace.WriteLine(String.Format("Server running on {0}", url)); 
     } 

     while (true) 
     { 
     } 
    } 
    /* ... */ 
} 

Startup.cs:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.MapSignalR(); 
    } 
} 

MyHub.cs:

public void Send(string name, string message) 
{ 
    Clients.All.addMessage(name, message); 
} 

端點 「MyEndpoint」 是在服務定義爲HTTP,公共和私人港口5001.

啓動該服務後,它顯示在Azure計算模擬器上運行在5001上。但是,如果我嘗試連接到ws://127.0.0.1:5001/signalr(或只是ws://127.0.0.1:5001)沒有迴應。爲此,我使用了兩個不同的Web套接字客戶端(兩者都是Chrome插件,並且使用其他WebSocket服務器時它們都可以正常工作)。

問題:

1)有什麼明顯的錯誤與我的設置?

2)我是否需要使用SignalR JS客戶端庫連接到SignalR服務器,或者實現WebSocket協議的任何香草客戶端是否應該能夠連接?

+0

在嘗試使用另一個Web Socket框架(XSockets)並且在WebRole(但作爲控制檯應用程序)運行時沒有獲得任何代碼工作後,我開始認爲這與Azure DevFabric處理網絡通信。有誰知道Azure是否有一些有趣的網絡方式可能會干擾Web Socket通信?端點在那裏,它們出現在計算模擬器中,但我似乎無法連接到它們。 – tremolo

回答

1

我知道這是一個有點老帖子,但以防萬一有人需要它...

1)有你需要解決兩個問題。所有的 首先,在啓動方法:

using (WebApp.Start<Startup>(url)) 
    { 
     Trace.WriteLine(String.Format("Server running on {0}", url)); 
    } 

返回IDisposable的(因此使用(...){}塊)指它立即設置創建後,因爲繼續執行權傳遞Trace.Writeline(.. )沒有停頓。

由於幾個原因,在Azure計算模擬器下運行這些操作也有點棘手,主要是因爲它重新映射端口以避免衝突。如果你打開一個命令提示符並運行

netstat -a 

你會發現,你已經打開的端口(聽)看起來像這樣(在我的情況我使用端口81):

TCP 127.0.0.1:82   MyComputer:0    LISTENING 
    TCP 127.0.0.3:81   MyComputer:0    LISTENING 

在Visual Studio的一般控制檯輸出中,你也很可能會看到這樣的

"Windows Azure Tools: Warning: Remapping private port 81 to 82 in role 'MyRoleThingy' to avoid conflict during emulation." 

這一切都意味着,爲了連接到SER你使用你的工作者角色託管,你必須連接到端口82而不是81(在你的情況下可能是5002)。

2)如果你實現協議,任何事情應該工作,我認爲。管理端口上的初始連接應始終有效。