0

私は Visual Studio 2012 で SignalR を使い始めました。これまでのところ、基本的なこつをつかみ、この例をガイドしました (ページ内のコードを参照できます)。上記の例に 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();
}

しかし、これは例外をスローします。

サーバークラスで行われているのと同じようにすべてを行っているため、例と同じ方法でURLを取得できる理由がわかりません。

私が達成しようとしている目標は、エンドポイントがアクセスされ、システムで何かが変更されたときに、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 用です。Signalr がハブ接続をネゴシエートするための 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 に答える