7

現在、SignalR を使用して、サーバーと、サーバー自体によって生成された複数の個別のプロセスとの間の通信を行っています。サーバーとクライアントの両方が C# でコーディングされています。私は SignalR 2.2.0.0 を使用しています。サーバー側では、OWIN を使用してサーバーを実行しています。また、LightInject を IoC コンテナーとして使用しています。

これが私のコードです:

public class AgentManagementStartup
{
    public void ConfigurationOwin(IAppBuilder app, IAgentManagerDataStore dataStore)
    {
        var serializer = new JsonSerializer
        {
            PreserveReferencesHandling = PreserveReferencesHandling.Objects,
            TypeNameHandling = TypeNameHandling.Auto,
            TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple
        };

        var container = new ServiceContainer();
        container.RegisterInstance(dataStore);
        container.RegisterInstance(serializer);
        container.Register<EventHub>();
        container.Register<ManagementHub>();
        var config = container.EnableSignalR();

        app.MapSignalR("", config);
    }
}

クライアント側では、次のように登録します。

public async Task Connect()
{
    try
    {
        m_hubConnection = new HubConnection(m_serverUrl, false);
        m_hubConnection.Closed += OnConnectionClosed;
        m_hubConnection.TraceLevel = TraceLevels.All;
        m_hubConnection.TraceWriter = Console.Out;

        var serializer = m_hubConnection.JsonSerializer;
        serializer.TypeNameHandling = TypeNameHandling.Auto;
        serializer.PreserveReferencesHandling = PreserveReferencesHandling.Objects;

        m_managementHubProxy = m_hubConnection.CreateHubProxy(AgentConstants.ManagementHub.Name);
        m_managementHubProxy.On("closeRequested", CloseRequestedCallback);

        await m_hubConnection.Start();
    }
    catch (Exception e)
    {
        m_logger.Error("Exception encountered in Connect method", e);
    }
}

サーバー側では、次の方法で終了リクエストを送信します。

var managementHub = GlobalHost.ConnectionManager.GetHubContext<ManagementHub>();
managementHub.Clients.All.closeRequested();

でコールバックを受け取ることはありませんCloseRequestedCallback。クライアント側でもサーバー側でも、ログにエラーが記録されません。

ここで何が間違っていましたか?

編集 09/10/15

いくつかの調査と修正を行った結果、IoC コンテナーの交換に関連していることがわかりました。LightInject にリンクされているものをすべて削除し、SignalR をそのまま使用すると、すべてが機能しました。LightInjectが SignalR との統合を文書化していたので、これには驚きました。

GlobalHost.DependencyResolverこれを見つけた後、 が に供給していたものと同じではないことに気付きましたHubConfiguration。追加したら

GlobalHost.DependencyResolver = config.Resolver;

app.MapSignalR("", config);

内でコールバックを受信して​​いますCloseRequestedCallback。残念ながら、クライアントからサーバーにメソッドを呼び出すとすぐに次のエラーが発生します。

Microsoft.AspNet.SignalR.Client.Infrastructure.SlowCallbackException

デッドロックの可能性が検出されました。「HubProxy.On」または「Connection.Received」で登録されたコールバックが少なくとも 10 秒間実行されています。

私が見つけた修正と、それがシステムに与える可能性のある影響についてはわかりません。GlobalHost.DependencyResolverデフォルトのコンテンツをすべて登録せずに、自分のものに置き換えてもよろしいですか?

編集 2 09/10/15

thisによると、を変更することGlobalHost.DependencyResolverは正しいことです。SlowCallbackExceptionすべてのコールバックで(まだ)何もしていないため、まだ説明がありません。

4

1 に答える 1