public async Task Send <TWorkflowMessage>(IEndpointConfiguration endpointConfiguration, TWorkflowMessage workflowMessage, CancellationToken cancellationToken)
            where TWorkflowMessage : class, IWorkflowMessage
        {
            VerifyEndpointConfiguration(endpointConfiguration);
            SetAuthenticationParameters(endpointConfiguration);

            var uriBuilder  = new WorkflowMessageHttpUriBuilder(endpointConfiguration.Address);
            var httpAddress = uriBuilder.Build(workflowMessage.State.JsonState);
            var httpMethod  = GetHttpMethod(endpointConfiguration);

            await MakeHttpCall(httpMethod, httpAddress, workflowMessage.State.JsonState, cancellationToken).ConfigureAwait(false);
        }
        public async Task <TResponseWorkflowMessage> Request <TRequestWorkflowMessage, TResponseWorkflowMessage>(
            IEndpointConfiguration endpointConfiguration, TRequestWorkflowMessage workflowMessage, CancellationToken cancellationToken)
            where TRequestWorkflowMessage : class, IWorkflowMessage
            where TResponseWorkflowMessage : class, IWorkflowMessage
        {
            VerifyEndpointConfiguration(endpointConfiguration);
            SetAuthenticationParameters(endpointConfiguration);

            var uriBuilder  = new WorkflowMessageHttpUriBuilder(endpointConfiguration.Address);
            var httpAddress = uriBuilder.Build(workflowMessage.State.JsonState);
            var httpMethod  = GetHttpMethod(endpointConfiguration);

            try
            {
                var httpResponseMessage = await MakeHttpCall(httpMethod, httpAddress, workflowMessage.State.JsonState, cancellationToken)
                                          .ConfigureAwait(false);

                var responseString = await httpResponseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);

                if (Log.IsEnabled(LogEventLevel.Verbose))
                {
                    Log.Verbose("Finished {method} request to {address} with {statusCode} and {response}",
                                httpMethod, httpAddress, httpResponseMessage.StatusCode, responseString);
                }

                var responseMessageType = ResolveClassByInterface <TResponseWorkflowMessage>();
                var responseMessage     = (TResponseWorkflowMessage)Activator.CreateInstance(responseMessageType);
                responseMessage.WorkflowMessageId  = Guid.NewGuid();
                responseMessage.WorkflowId         = workflowMessage.WorkflowId;
                responseMessage.WorkflowInstanceId = workflowMessage.WorkflowInstanceId;

                if (responseString.TryConvertToJsonState(out var jsonState))
                {
                    responseMessage.State = new WorkflowMessageState(jsonState);
                }

                return(responseMessage);
            }
            catch (Exception ex)
            {
                Log.Error(ex, "An error has occurred during making call to {address}", httpAddress);
                throw;
            }
        }