我正在尝试使用SignalR,OWIN和Azure Worker Roles来获取一个简单的WebSocket服务器。
工作人员角色.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 计算模拟器下显示为在 5001 上运行。但是,如果我尝试连接到 ws://127.0.0.1:5001/signalr(或只是 ws://127.0.0.1:5001),则没有响应。为此,我使用了两个不同的Web套接字客户端(都是Chrome插件,并且使用其他WebSocket服务器都可以正常工作)。
问题:
1) 我的设置有什么明显的问题吗?
2) 我是否需要使用 SignalR JS 客户端库连接到 SignalR 服务器,或者任何实现 WebSocket 协议的原版客户端都应该能够连接?
这是一个有点旧的帖子,但以防万一有人需要它......
1)有两个问题需要解决。首先,启动方法在:
using (WebApp.Start<Startup>(url))
{
Trace.WriteLine(String.Format("Server running on {0}", url));
}
返回一个 IDisposable(因此使用 (...){} block) 表示它在创建后立即被释放,因为执行继续向右传递 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."
这一切都意味着,为了连接到使用辅助角色托管的服务器,必须连接到端口 82 而不是 81(在本例中可能是 5002)。
2)如果你实现协议,我认为任何事情都应该有效。管理端口上的初始连接应始终有效。