0

我开始在 Visual Studio 2012 上使用 SignalR,到目前为止我已经掌握了它的基本窍门,我引导自己完成了这个示例(您可以浏览页面中的代码)。我决定要在上述示例中添加一个 REST 服务,所以我向它添加了一个基本服务并且它起作用了。

我想采取的下一步是在服务和 SignalR 之间添加一个通信,所以根据示例向我展示的内容,我只需要通过我的项目中的 url 创建一个 HubConnection(在这种情况下,示例使用网址 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();
}

但这会引发一个异常,这个

我不明白为什么我可以以与示例相同的方式获取 url,因为我所做的一切都与在 Server 类上所做的一样。

我试图实现的目标是,当访问端点并且我的系统发生变化时,SignalR 会通知连接到它的客户端。

我希望任何人都可以帮助我了解我的工作出了什么问题。

编辑

我在这里添加了我的 ServiceConfiguration.Local.cscfg、我的 ServiceConfiguration.Cloud.cscfg 和 ServiceDefinition.csdef 文件作为参考,我认为问题应该就在那里,但老实说我不知道​​为什么这不起作用.

编辑 2

我在这一行收到以下异常var url = RoleEnvironment.GetConfigurationSettingValue("http://localhost:4200");

例外是:

SEHExcetion occurred. External component has thrown an exception.
4

1 回答 1

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
};
于 2012-12-29T01:38:55.323 回答