所以我有一个我自己构建的自定义管道,因为我的整个程序没有捕获任何异常(在purpese上)我想在比Hub更高的级别捕获它们。
我的public sealed class CommonPipelineModule : HubPipelineModule
包含方法public override Func<IHubIncomingInvokerContext, Task<object>> BuildIncoming(Func<IHubIncomingInvokerContext, Task<object>> invoke)
。
代码如下:
public sealed class CommonPipelineModule : HubPipelineModule
{
public override Func<IHubIncomingInvokerContext, Task<object>> BuildIncoming(Func<IHubIncomingInvokerContext, Task<object>> invoke)
{
return base.BuildIncoming(async context =>
{
Func<Task<object>> myInvoker = async () =>
{
try
{
return await invoke(context);
}
catch (Exception e)
{
return new FailureResponseObject(e as dynamic, e.Message);
}
};
return await myInvoker();
}
}
}
FailureResponseObject知道如何处理异常并创建一个客户更熟悉的对象。
问题是:我希望客户端在fail
回调而不是success
回调中接收对象。
所以我想我可以抛出异常而不是返回自定义对象来获取fail
回调,但是我想在我的管道中处理这个而不是在某个上层。
我正在寻找一些上下文状态更改或类似的东西,可能就像更改HTTP请求中的http响应代码一样。
有这篇文章:Call .fail(error) without throwing exception但也许2年之后在Signalr 2.0中发生了一些变化(我正在使用它)