SignalR强类型Hub:无返回值方法如何获取异常反馈?
SignalR强类型Hub无返回值方法的异常反馈处理方案
1. 强制使用InvokeAsync调用无返回值方法
不管Hub端方法是否有返回值,客户端都可以直接用InvokeAsync替代默认的SendAsync。InvokeAsync会等待服务器端处理完成,能捕获并回传服务器抛出的异常,无需修改Hub端方法定义。
示例代码:
客户端调用:
try { await _hubConnection.InvokeAsync(nameof(MyHub.MyVoidMethod)); } catch (Exception ex) { // 处理服务器端返回的异常 Console.WriteLine($"服务器出错:{ex.Message}"); }
Hub端方法:
public class MyHub : Hub<IMyClient> { public void MyVoidMethod() { // 模拟业务逻辑抛出异常 throw new InvalidOperationException("服务器端处理失败"); } }
2. 自定义异常回调机制
如果不想依赖InvokeAsync的等待逻辑,可以在客户端定义一个异常接收回调,当Hub端无返回值方法执行出错时,主动推送异常信息到客户端。
示例:
客户端接口定义:
public interface IMyClient { void ReceiveServerException(string errorDetails); }
Hub端方法实现:
public async Task MyVoidMethod() { try { // 执行业务逻辑 throw new InvalidOperationException("服务器端处理失败"); } catch (Exception ex) { // 主动向调用方推送异常信息 await Clients.Caller.ReceiveServerException(ex.ToString()); } }
客户端注册回调:
_hubConnection.On<string>("ReceiveServerException", error => { // 处理异常信息 Console.WriteLine($"服务器异常:{error}"); });
3. 兜底方案:给方法添加占位返回值
把无返回值方法修改为返回Task(或任意占位类型,如bool、object),强类型Hub会自动用InvokeAsync处理这类方法调用,服务器端异常会直接回传到客户端,无需额外调整调用逻辑。
示例:
Hub端修改方法:
public class MyHub : Hub<IMyClient> { public Task MyVoidMethod() { throw new InvalidOperationException("服务器端处理失败"); return Task.CompletedTask; // 正常流程返回完成任务 } }
客户端调用(强类型代理自动用InvokeAsync):
try { await _hub.MyVoidMethod(); } catch (Exception ex) { // 捕获服务器端异常 }
内容的提问来源于stack exchange,提问作者Josh Close
相关产品推荐
相关产品推荐

