我正在尝试使用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客户端是否能够连接?
答案 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)如果你实施协议,我认为任何事都应该有效。管理端口上的初始连接应始终有效。