【问题标题】:Cannot get simple SignalR Azure worker role to work无法让简单的 SignalR Azure 辅助角色工作
【发布时间】:2013-10-11 22:43:09
【问题描述】:

我正在尝试使用 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) 
        {
        }
    }
    /* ... */
}

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

【问题讨论】:

  • 在尝试使用另一个 Web Socket 框架 (XSockets) 后,在 WebRole 中运行时没有任何代码可以工作(但作为控制台应用程序工作),我开始认为这有一些问题了解 Azure DevFabric 如何处理网络通信。有谁知道 Azure 是否在网络方面做了一些有趣的事情,可能会干扰 Web Socket 通信?端点在那里,它们出现在 Compute Emulator 中,但我似乎无法连接到它们。

标签: azure websocket signalr azure-worker-roles


【解决方案1】:

我知道这是一篇旧帖子,但以防万一有人需要...

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 的 general 控制台输出中,您很可能还会看到类似

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多