无法获得简单的SignalR Azure辅助工作角色

时间:2013-10-11 22:43:09

标签: azure websocket signalr azure-worker-roles

我正在尝试使用SignalR,OWIN和Azure Worker角色来使用简单的WebSocket服务器。

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 Compute Emulator下显示为在5001上运行。但是,如果我尝试连接到ws://127.0.0.1:5001 / signalr(或只是ws://127.0.0.1: 5001)没有回应。我正在使用两个不同的Web套接字客户端(两个都是Chrome插件,它们都可以使用其他WebSocket服务器正常工作)。

问题:

1)我的设置有什么明显错误吗?

2)我是否需要使用SignalR JS客户端库连接到SignalR服务器,或者任何实现WebSocket协议的vanilla客户端是否能够连接?

1 个答案:

答案 0 :(得分:0)

我知道这是一个古老的帖子,但万一有人需要它......

1)您需要解决两个问题。 首先,开始方法:

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

返回一个IDisposable(因此using(...){}块)意味着它会在创建后立即处理,因为执行继续正确传递Trace.Writeline(...)而不会暂停。

由于某些原因,在Azure Compute Emulator下运行这些东西也有点棘手,主要是因为它重新映射端口以避免冲突。如果打开命令提示符并运行

    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."

这意味着,为了使用您的辅助角色连接到您正在托管的服务器,您必须连接到端口82而不是81(在您的情况下可能是5002)。

2)如果你实施协议,我认为任何事都应该有效。管理端口上的初始连接应始终有效。