SignalR - 无法为HubConnection创建URL

时间:2012-12-29 00:50:12

标签: azure visual-studio-2012 signalr azure-web-roles

我开始在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.

1 个答案:

答案 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
};