hub - signalr チャット
参照先プロジェクトのハブをマップする (1)
私はこれに対する答えを見つけたと思います。
ソースコードを少し掘り下げた後、SignalRは次のメソッドを使ってハブを見つけるためのIAssemblyLocatorを指定しているようです。
internal static RouteBase MapHubs(this RouteCollection routes, string name, string path, HubConfiguration configuration, Action<IAppBuilder> build)
{
var locator = new Lazy<IAssemblyLocator>(() => new BuildManagerAssemblyLocator());
configuration.Resolver.Register(typeof(IAssemblyLocator), () => locator.Value);
InitializeProtectedData(configuration);
return routes.MapOwinPath(name, path, map =>
{
build(map);
map.MapHubs(String.Empty, configuration);
});
}
public class BuildManagerAssemblyLocator : DefaultAssemblyLocator
{
public override IList<Assembly> GetAssemblies()
{
return BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToList();
}
}
public class DefaultAssemblyLocator : IAssemblyLocator
{
public virtual IList<Assembly> GetAssemblies()
{
return AppDomain.CurrentDomain.GetAssemblies();
}
}
これは参照されていたにもかかわらずロードされていなかったため、単純に現在のドメインに外部アセンブリを追加しようとしました。
WebApp.Startを呼び出す前に、次の行を呼び出します。
static void Main(string[] args)
{
string url = "http://localhost:8080";
// Add this line
AppDomain.CurrentDomain.Load(typeof(Core.Chat).Assembly.FullName);
using (WebApp.Start<Startup>(url))
{
Console.WriteLine("Server running on {0}", url);
Console.ReadLine();
}
}
Core.Chatは単に私が使っているHubクラスです。 そして、参照アセンブリに定義されているハブがロードされます。
これについてもっと直接的な方法があるかもしれませんが、私はドキュメンテーションの中に何かを見つけることができませんでした。
お役に立てれば。
私の場合、私のハブは、セルフホストアプリケーションを起動するプロジェクトコードから参照されるプロジェクト内にあります。
line connection.Start().Wait();
私は例外があります。 その行でスローされる一連の例外は次のとおりです。
- 指定されたレジストリキーは存在しません System.IO.IOException
- 'MessageHub'ハブを解決できませんでした InvalidOperationException
- リモートサーバーからエラーが返されました:(500)内部サーバーエラー WebException
参照先プロジェクトのメッセージハブクラスのシグネチャは、 public class MessageHub : Hub
です。
更新:理論をテストするために、参照先のプロジェクトからハブプロジェクトを自分のテストプロジェクトに移動し、ネームスペースを更新しました。 出来た。 つまり、ここでの理論は正しいと思います。デフォルトのハブ解決では、参照先のプロジェクトまたは別の名前空間にハブは見つかりません。
参照されているプロジェクトでMapHubsにテストハブを見つけるように説得するにはどうすればよいですか。