diff --git a/src/Dapr.Actors/Client/ActorProxyFactory.cs b/src/Dapr.Actors/Client/ActorProxyFactory.cs index 91c5e752..95bccf93 100644 --- a/src/Dapr.Actors/Client/ActorProxyFactory.cs +++ b/src/Dapr.Actors/Client/ActorProxyFactory.cs @@ -58,7 +58,7 @@ namespace Dapr.Actors.Client options ??= this.DefaultOptions; var actorProxy = new ActorProxy(); - var daprInteractor = new DaprHttpInteractor(this.handler, options.HttpEndpoint, options.DaprApiToken); + var daprInteractor = new DaprHttpInteractor(this.handler, options.HttpEndpoint, options.DaprApiToken, options.RequestTimeout); var nonRemotingClient = new ActorNonRemotingClient(daprInteractor); actorProxy.Initialize(nonRemotingClient, actorId, actorType, options); @@ -70,7 +70,7 @@ namespace Dapr.Actors.Client { options ??= this.DefaultOptions; - var daprInteractor = new DaprHttpInteractor(this.handler, options.HttpEndpoint, options.DaprApiToken); + var daprInteractor = new DaprHttpInteractor(this.handler, options.HttpEndpoint, options.DaprApiToken, options.RequestTimeout); var remotingClient = new ActorRemotingClient(daprInteractor); var proxyGenerator = ActorCodeBuilder.GetOrCreateProxyGenerator(actorInterfaceType); var actorProxy = proxyGenerator.CreateActorProxy(); diff --git a/src/Dapr.Actors/Client/ActorProxyOptions.cs b/src/Dapr.Actors/Client/ActorProxyOptions.cs index f64e79da..e3887700 100644 --- a/src/Dapr.Actors/Client/ActorProxyOptions.cs +++ b/src/Dapr.Actors/Client/ActorProxyOptions.cs @@ -49,5 +49,10 @@ namespace Dapr.Actors.Client /// /// public string HttpEndpoint { get; set; } = DaprDefaults.GetDefaultHttpEndpoint(); + + /// + /// The timeout allowed for an actor request. Can be set to System.Threading.Timeout.InfiniteTimeSpan to disable any timeouts. + /// + public TimeSpan? RequestTimeout { get; set; } = null; } } diff --git a/src/Dapr.Actors/DaprHttpInteractor.cs b/src/Dapr.Actors/DaprHttpInteractor.cs index 51f72d25..4229df97 100644 --- a/src/Dapr.Actors/DaprHttpInteractor.cs +++ b/src/Dapr.Actors/DaprHttpInteractor.cs @@ -36,12 +36,14 @@ namespace Dapr.Actors public DaprHttpInteractor( HttpMessageHandler clientHandler, string httpEndpoint, - string apiToken) + string apiToken, + TimeSpan? requestTimeout) { this.handler = clientHandler ?? defaultHandler; this.httpEndpoint = httpEndpoint; this.daprApiToken = apiToken; this.httpClient = this.CreateHttpClient(); + this.httpClient.Timeout = requestTimeout ?? this.httpClient.Timeout; } public async Task GetStateAsync(string actorType, string actorId, string keyName, CancellationToken cancellationToken = default) diff --git a/src/Dapr.Actors/Runtime/ActorRuntime.cs b/src/Dapr.Actors/Runtime/ActorRuntime.cs index ea049240..5b790db6 100644 --- a/src/Dapr.Actors/Runtime/ActorRuntime.cs +++ b/src/Dapr.Actors/Runtime/ActorRuntime.cs @@ -41,7 +41,7 @@ namespace Dapr.Actors.Runtime // Revisit this if actor initialization becomes a significant source of delay for large projects. foreach (var actor in options.Actors) { - var daprInteractor = new DaprHttpInteractor(clientHandler: null, httpEndpoint: options.HttpEndpoint, apiToken: options.DaprApiToken); + var daprInteractor = new DaprHttpInteractor(clientHandler: null, httpEndpoint: options.HttpEndpoint, apiToken: options.DaprApiToken, requestTimeout: null); this.actorManagers[actor.Type.ActorTypeName] = new ActorManager( actor, actor.Activator ?? this.activatorFactory.CreateActivator(actor.Type), diff --git a/test/Dapr.Actors.Test/Runtime/ActorManagerTests.cs b/test/Dapr.Actors.Test/Runtime/ActorManagerTests.cs index a4708d7e..3a289ba9 100644 --- a/test/Dapr.Actors.Test/Runtime/ActorManagerTests.cs +++ b/test/Dapr.Actors.Test/Runtime/ActorManagerTests.cs @@ -17,7 +17,7 @@ namespace Dapr.Actors.Runtime private ActorManager CreateActorManager(Type type, ActorActivator activator = null) { var registration = new ActorRegistration(ActorTypeInformation.Get(type)); - var interactor = new DaprHttpInteractor(clientHandler: null, "http://localhost:3500", apiToken: null); + var interactor = new DaprHttpInteractor(clientHandler: null, "http://localhost:3500", apiToken: null, requestTimeout: null); return new ActorManager(registration, activator ?? new DefaultActorActivator(), JsonSerializerDefaults.Web, NullLoggerFactory.Instance, ActorProxy.DefaultProxyFactory, interactor); } diff --git a/test/Shared/TestClient.cs b/test/Shared/TestClient.cs index ce138536..e18a0600 100644 --- a/test/Shared/TestClient.cs +++ b/test/Shared/TestClient.cs @@ -30,7 +30,7 @@ namespace Dapr internal static TestClient CreateForDaprHttpInterator(string? apiToken = null) { var handler = new CapturingHandler(); - return new TestClient(new DaprHttpInteractor(handler, "http://localhost:3500", apiToken), handler); + return new TestClient(new DaprHttpInteractor(handler, "http://localhost:3500", apiToken, null), handler); } #endif