Skip to content

Commit 5fdca6d

Browse files
allow BeforeCall to set AsyncLocal for the targeted method itself
1 parent 4b29ac9 commit 5fdca6d

File tree

2 files changed

+21
-17
lines changed

2 files changed

+21
-17
lines changed

src/UiPath.CoreIpc/Client/ServiceClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ private static ServiceClientProperFactory CreateFactory(Type clientType)
167167
}
168168

169169
var ctor = typeof(ServiceClientProper<,>)
170-
.MakeGenericType(clientStateType, clientType)
170+
.MakeGenericType(clientType, clientStateType)
171171
.GetConstructor([clientType, typeof(Type)])!;
172172

173173
var paramofClientBase = Expression.Parameter(typeof(ClientBase));

src/UiPath.CoreIpc/Server/Server.cs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)