Remove fast-path cancellation check from CallTool (#48)

This commit is contained in:
Stephen Toub 2025-03-09 06:18:21 -04:00 • committed by GitHub
commit 04af21046b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,6 +1,7 @@
using System.ComponentModel; using System.ComponentModel;
using System.Globalization; using System.Globalization;
using System.Reflection; using System.Reflection;
using System.Runtime.ExceptionServices;
using System.Text.Json; using System.Text.Json;
using McpDotNet.Configuration; using McpDotNet.Configuration;
using McpDotNet.Protocol.Types; using McpDotNet.Protocol.Types;
@ -171,18 +172,28 @@ public static partial class McpServerBuilderExtensions
private static async Task<CallToolResponse> CallTool(RequestContext<CallToolRequestParams> request, MethodInfo method, CancellationToken cancellationToken) private static async Task<CallToolResponse> CallTool(RequestContext<CallToolRequestParams> request, MethodInfo method, CancellationToken cancellationToken)
{ {
cancellationToken.ThrowIfCancellationRequested();
var methodParameters = method.GetParameters(); var methodParameters = method.GetParameters();
List<object?> parameters = ResolveParameters(request, methodParameters, cancellationToken); List<object?> parameters = ResolveParameters(request, methodParameters, cancellationToken);
if (cancellationToken.IsCancellationRequested)
return new CallToolResponse { Content = [new Content { Text = "Operation was cancelled" }] };
try
{
using var scope = request.Server.ServiceProvider?.CreateScope(); using var scope = request.Server.ServiceProvider?.CreateScope();
var objectInstance = CreateObjectInstance(method, scope?.ServiceProvider); var objectInstance = CreateObjectInstance(method, scope?.ServiceProvider);
var result = method.Invoke(objectInstance, parameters.ToArray()); object? result;
try
{
const BindingFlags InvokeFlags =
#if NET
BindingFlags.DoNotWrapExceptions |
#endif
BindingFlags.Default;
result = method.Invoke(objectInstance, InvokeFlags, binder: null, parameters.ToArray(), culture: null);
}
catch (TargetInvocationException e) when (e.InnerException is not null)
{
ExceptionDispatchInfo.Capture(e.InnerException).Throw();
throw; // unreachable
}
if (result is Task task) if (result is Task task)
{ {
@ -205,11 +216,6 @@ public static partial class McpServerBuilderExtensions
return new CallToolResponse { Content = [new Content() { Text = result.ToString(), Type = "text" }] }; return new CallToolResponse { Content = [new Content() { Text = result.ToString(), Type = "text" }] };
} }
catch (TargetInvocationException e)
{
throw new McpServerException(e.Message, e);
}
}
private static List<object?> ResolveParameters(RequestContext<CallToolRequestParams> request, ParameterInfo[] methodParameters, CancellationToken cancellationToken) private static List<object?> ResolveParameters(RequestContext<CallToolRequestParams> request, ParameterInfo[] methodParameters, CancellationToken cancellationToken)
{ {