1

我正在尝试使用 SignalR、OWIN 和 Azure Worker Roles 构建一个简单的 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) 
        {
        }
    }
    /* ... */
}

启动.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 协议的普通客户端都可以连接?

4

1 回答 1

0

我知道这是一个有点旧的帖子,但以防万一有人需要它......

1)有两个问题需要解决。首先,Start方法在:

    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)如果您实施协议,我认为任何事情都应该有效。管理端口上的初始连接应该始终有效。

于 2014-01-09T13:37:23.270 回答