@@ -81,7 +81,7 @@ private async ValueTask OnRequestReceived(Request request)
8181 }
8282 if ( ! _router . TryResolve ( request . Endpoint , out var route ) )
8383 {
84- await OnError ( request , new EndpointNotFoundException ( nameof ( request . Endpoint ) , DebugName , request . Endpoint ) ) ;
84+ await OnError ( request , new EndpointNotFoundException ( nameof ( request . Endpoint ) , DebugName , request . Endpoint ) ) ;
8585 return ;
8686 }
8787 var method = GetMethod ( route . Service . Type , request . MethodName ) ;
@@ -131,9 +131,6 @@ private async ValueTask<Response> HandleRequest(Method method, Route route, Requ
131131 {
132132 var arguments = GetArguments ( ) ;
133133
134- var callInfo = new CallInfo ( newConnection : false , method . MethodInfo , arguments ) ;
135- await route . BeforeCall . OrDefault ( ) ( callInfo , cancellationToken ) ;
136-
137134 object service ;
138135 using ( route . Service . Get ( out service ) )
139136 {
@@ -148,24 +145,31 @@ async ValueTask<Response> InvokeMethod()
148145 var scheduler = route . Scheduler ;
149146 Debug . Assert ( scheduler != null ) ;
150147 var defaultScheduler = scheduler == TaskScheduler . Default ;
148+
151149 if ( returnTaskType . IsGenericType )
152150 {
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
157152 {
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+ } ;
161156 }
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 ( )
163163 {
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 ) ;
166170 }
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 ( ) ;
169173 }
170174 object ? [ ] GetArguments ( )
171175 {
0 commit comments