@@ -81,7 +81,7 @@ private async ValueTask OnRequestReceived(Request request)
81
81
}
82
82
if ( ! _router . TryResolve ( request . Endpoint , out var route ) )
83
83
{
84
- await OnError ( request , new EndpointNotFoundException ( nameof ( request . Endpoint ) , DebugName , request . Endpoint ) ) ;
84
+ await OnError ( request , new EndpointNotFoundException ( nameof ( request . Endpoint ) , DebugName , request . Endpoint ) ) ;
85
85
return ;
86
86
}
87
87
var method = GetMethod ( route . Service . Type , request . MethodName ) ;
@@ -131,9 +131,6 @@ private async ValueTask<Response> HandleRequest(Method method, Route route, Requ
131
131
{
132
132
var arguments = GetArguments ( ) ;
133
133
134
- var callInfo = new CallInfo ( newConnection : false , method . MethodInfo , arguments ) ;
135
- await route . BeforeCall . OrDefault ( ) ( callInfo , cancellationToken ) ;
136
-
137
134
object service ;
138
135
using ( route . Service . Get ( out service ) )
139
136
{
@@ -148,24 +145,31 @@ async ValueTask<Response> InvokeMethod()
148
145
var scheduler = route . Scheduler ;
149
146
Debug . Assert ( scheduler != null ) ;
150
147
var defaultScheduler = scheduler == TaskScheduler . Default ;
148
+
151
149
if ( returnTaskType . IsGenericType )
152
150
{
153
- var methodResult = defaultScheduler ? MethodCall ( ) : await RunOnScheduler ( ) ;
154
- await methodResult ;
155
- var returnValue = GetTaskResult ( returnTaskType , methodResult ) ;
156
- if ( returnValue is Stream downloadStream )
151
+ return await ScheduleMethodCall ( ) switch
157
152
{
158
- return Response . Success ( request , downloadStream ) ;
159
- }
160
- return Response . Success ( request , Serializer . Serialize ( returnValue ) ) ;
153
+ Stream downloadStream => Response . Success ( request , downloadStream ) ,
154
+ var x => Response . Success ( request , Serializer . Serialize ( x ) )
155
+ } ;
161
156
}
162
- else
157
+
158
+ ScheduleMethodCall ( ) . LogException ( Logger , method . MethodInfo ) ;
159
+ return Response . Success ( request , "" ) ;
160
+
161
+ Task < object ? > ScheduleMethodCall ( ) => defaultScheduler ? MethodCall ( ) : RunOnScheduler ( ) ;
162
+ async Task < object ? > MethodCall ( )
163
163
{
164
- ( defaultScheduler ? MethodCall ( ) : RunOnScheduler ( ) . Unwrap ( ) ) . LogException ( Logger , method . MethodInfo ) ;
165
- return Response . Success ( request , "" ) ;
164
+ await ( route . BeforeCall ? . Invoke (
165
+ new CallInfo ( newConnection : false , method . MethodInfo , arguments ) ,
166
+ cancellationToken ) ?? Task . CompletedTask ) ;
167
+ var invocationTask = method . Invoke ( service , arguments , cancellationToken ) ;
168
+ await invocationTask ;
169
+ return GetTaskResult ( returnTaskType , invocationTask ) ;
166
170
}
167
- Task MethodCall ( ) => method . Invoke ( service , arguments , cancellationToken ) ;
168
- Task < Task > RunOnScheduler ( ) => Task . Factory . StartNew ( MethodCall , cancellationToken , TaskCreationOptions . DenyChildAttach , scheduler ) ;
171
+
172
+ Task < object ? > RunOnScheduler ( ) => Task . Factory . StartNew ( MethodCall , cancellationToken , TaskCreationOptions . DenyChildAttach , scheduler ) . Unwrap ( ) ;
169
173
}
170
174
object ? [ ] GetArguments ( )
171
175
{
0 commit comments