{"record":{"id":"52ee8f27928ca3ca","repo":"MassTransit/MassTransit","slug":"only-one-handler-of-type-typecache-t-shortname-can-be","errorCode":null,"errorMessage":"Only one handler of type {TypeCache<T>.ShortName} can be registered","messagePattern":"Only one handler of type (.+?) can be registered","errorType":"exception","errorClass":"RequestException","httpStatus":null,"severity":"error","filePath":"src/MassTransit/Clients/ClientRequestHandle.cs","lineNumber":181,"sourceCode":"            var requestException = new RequestCanceledException(RequestId.ToString(\"D\"), exception, exception.CancellationToken);\n\n            Fail(requestException);\n\n            throw requestException;\n        }\n        catch (Exception exception)\n        {\n            Fail(exception);\n\n            throw new RequestException($\"An exception occurred while processing the {typeof(TRequest).Name} request\", exception);\n        }\n    }\n\n    Task<Response<T>> Response<T>(MessageHandler<T>? handler = null, Action<IHandlerConfigurator<T>>? configure = null)\n        where T : class\n    {\n        if (_responseHandlers.ContainsKey(typeof(T)))\n            throw new RequestException($\"Only one handler of type {TypeCache<T>.ShortName} can be registered\");\n\n        var configurator = new ResponseHandlerConfigurator<T>(_taskScheduler, handler, _send);\n\n        configure?.Invoke(configurator);\n\n        if (_cancellationToken.IsCancellationRequested)\n            return TaskUtil.Cancelled<Response<T>>();\n\n        HandlerConnectHandle<T> handle = configurator.Connect(_context, RequestId);\n\n        _responseHandlers.Add(typeof(T), handle);\n\n        return handle.Task;\n    }\n\n    void HandleFault()\n    {\n        if (_cancellationToken.IsCancellationRequested)","sourceCodeStart":163,"sourceCodeEnd":199,"githubUrl":"https://github.com/MassTransit/MassTransit/blob/62ab339afa3bac2e9b3fe1769d0d35d7e44778e9/src/MassTransit/Clients/ClientRequestHandle.cs#L163-L199","documentation":"ClientRequestHandle.Response<T> throws RequestException when a response handler for the same response type T is already registered on the request handle. Each request handle permits at most one handler per response message type.","triggerScenarios":"Calling .Handle<T>(...) or Response<T>(...) twice with the same response type on a single request, e.g. chaining Response<OrderAccepted> twice or registering the type both in GetResponse<T> and a subsequent Handle<T>.","commonSituations":"Copy-pasting handler registrations; registering handlers in both a generic GetResponse<T1,T2> call and explicit Handle calls; reusing a completed ClientRequestHandle for a second call.","solutions":["Register the handler for each response type only once per request handle","Remove the duplicate Handle<T>/Response<T> call for the repeated type","Create a new request (new handle) if you need a different handler arrangement"],"exampleFix":"// before\nrequest.Handle<OrderAccepted>(...);\nrequest.Handle<OrderAccepted>(...); // duplicate\n// after\nrequest.Handle<OrderAccepted>(...);\nrequest.Handle<OrderRejected>(...);","handlingStrategy":"validation","validationCode":"if (request is ClientRequestHandle<TRequest> h && h.HasHandler<T>()) throw new InvalidOperationException(\"handler already registered for \" + typeof(T).Name);","typeGuard":null,"tryCatchPattern":"try { request.Handle<T>(handler); } catch (RequestException ex) when (ex.Message.Contains(\"Only one handler\")) { /* skip duplicate */ }","preventionTips":["Register at most one handler per response type per request","Centralize handler registration to avoid duplicates","Create a fresh request handle for each request"],"tags":["messaging","request-response","duplicate-handler"],"backgroundTag":"conflicting-config-options","analyzedSha":"62ab339afa3bac2e9b3fe1769d0d35d7e44778e9","analyzedAt":"2026-09-13T22:47:47.593Z","contentChangedAt":"2026-09-13T22:47:47.593Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}