有没有办法查看 ClientProxy 的可用客户端功能?

Is there anyway to see the available client side functions for a ClientProxy?

我目前正在调试一个大型应用程序,该应用程序存在一些与通过客户端端点进行的服务器端调用相关的错误,这些错误不会导致客户端调用。从调试的角度来看,我有点迷路了。它会帮助我查看可用客户端功能的列表,但可能不可用。从跟踪日志的角度来看,我看不到任何条目表明函数调用有任何问题(下面的 system.diagnostics 条目)。

关于单元测试或调试策略有什么想法吗?

<switches>
  <add name="SignalRSwitch" value="Verbose" />
</switches>
<!-- Specifies the trace writer for output -->
<sharedListeners>
  <!-- Listener for transport events -->
  <add name="SignalR-Transports" type="System.Diagnostics.TextWriterTraceListener" initializeData="transports.log.txt" />
  <!-- Listener for scaleout provider events -->
  <add name="SignalR-Bus" type="System.Diagnostics.TextWriterTraceListener" initializeData="bus.log.txt" />
  <!-- Listener for hub discovery events -->
  <add name="SignalR-Init" type="System.Diagnostics.TextWriterTraceListener" initializeData="init.log.txt" />
</sharedListeners>
<trace autoflush="true" />

据我所知,至少 在服务器上 ,没有。在客户端定义的用于处理服务器到客户端调用的代码只是一堆服务器完全不知道的事件处理程序。理论上,您可以拥有多个客户端代码段,每个代码段具有不同的处理程序,而服务器无法通过任何方式了解所有这些代码段。那将是完全合法的,并且可以更容易地理解为什么无法知道您的要求。

在幕后,SignalR 只是为每个服务器到客户端的调用发送 消息 ,其中每个消息都有一些 字段 ,其中之一它们包含要触发的 事件 的客户端 name。因此,服务器只发送字符串 并忘记它们 ,客户端接收它们并动态检查是否存在该名称的任何处理程序。

如果 foo 在客户端上不存在,您的目标是避免调用 Clients.All.foo("bar") 之类的东西吗?也许您的代码中有几个地方可能会发生这种情况,因此当东西 reorganized/refactored 时,很难控制动态调用?如果是,那么一个建议可能是定义一个新的 C# 类型,并将服务器上的每个动态调用集中在该类型的相应方法中。通过使用该类型的实例(它也可以是静态的),您的集线器或通过 IHubContext 的调用不可能出错,并且您可以将动态调用集中在一个地方。这当然不能完全解决问题,但有助于控制它,因为动态调用只在一个地方,并且更容易使它们与客户端代码保持一致。

有些库包装了 SignalR 并使其更加静态。我是一个名为 SignalR.EventAggregatorProxy

的库的作者

它是一个 pub/sub 包装器,消息是 C# 类,使用动态脚本(很像集线器代理)代理给客户端