我开始在Visual Studio 2012上使用SignalR,到目前为止我已经掌握了它的基本内容,我引导自己完成了this示例(您可以浏览页面中的代码)。我决定在示例中添加一个REST服务,所以我为它添加了一个基本服务并且它有效。
我想要采取的下一步是在服务和SignalR之间添加一个通信,所以根据示例向我展示的内容,我只需要通过我项目中的url创建一个HubConnection(在这种情况下,示例使用url http:localhost:4200)。您可以检查WorkerRoleHubConfiguration类,它有一个具有下一行的方法:
return RoleEnvironment.GetConfigurationSettingValue("GUI_URL");
GUI_URL是http:localhost:4200。
在我的服务类中,我刚刚添加了一个方法,其中包含以下内容:
var url = RoleEnvironment.GetConfigurationSettingValue("http://localhost:4200");
try
{
HubConnection _connection = new HubConnection(url);
IHubProxy _hub = _connection.CreateProxy("SiteMonitR");
_hub.Invoke("displayResult");
}
catch (Exception ex)
{
error = ex.ToString();
}
但是这引发了一个例外,this一个。
我没有说明为什么我能以与示例相同的方式获取url,因为我在Server类上完成所有操作。
我想要实现的目标是,当一个端点被接收并且我的系统发生了某些变化时,SignalR会通知连接到它的客户端。
我希望有人能帮助我理解我的工作有什么问题。
修改
我正在添加我的ServiceConfiguration.Local.cscfg,我的ServiceConfiguration.Cloud.cscfg和ServiceDefinition.csdef文件作为参考here,我认为问题应该在那里,但说实话我不知道为什么这不起作用。
编辑2
我在此行var url = RoleEnvironment.GetConfigurationSettingValue("http://localhost:4200");
例外是:
SEHExcetion occurred. External component has thrown an exception.
答案 0 :(得分:0)
URL用于GUI - 它必须是信号器协商集线器连接的Web界面。在该示例中,集线器(服务器)将更新发送到来自配置的URL的连接 - 再次是Web界面(html页面)。
通信逻辑需要驻留在Server类中,并从worker角色调用。例如,在以worker角色调用服务之后,调用server.DoSomething(“message”)以向服务器调用消息。这段代码看起来像是:
public Class Server
{ ...
public void DoSomething(string message)
{
_hub.Invoke("doSomething", message);
}
...
}
然后在Server.Run()中添加:
// whenever a DoSomething is called
_hub.On<string>("doSomething", (message) => _hub.Invoke("doSomething", message));
在SiteMonitRNotificationHub中
public class SiteMonitRNotificationHub : Hub
{
...
public void DoSomething(string address)
{
Clients.doingSomething(address);
}
...
}
最后在web gui的控制器脚本中:
c.siteMonitorHub
...
.on('doingSomething', function (message) {
c.doSomething(message);
})
和...
this.doSomething= function (message) {
// do something in your web page with message
};