in src/WebJobs.Extensions.DurableTask/HttpApiHandler.cs [860:946]
private async Task<HttpResponseMessage> HandleStartOrchestratorRequestAsync(
HttpRequestMessage request,
string functionName,
string instanceId)
{
try
{
IDurableOrchestrationClient client = this.GetClient(request);
var queryNameValuePairs = request.GetQueryNameValuePairs();
string json = null;
object input = null;
if (request.Content != null && request.Content.Headers?.ContentLength != 0)
{
json = await request.Content.ReadAsStringAsync();
input = JsonConvert.DeserializeObject(json, this.messageDataConverter.JsonSettings);
}
string id = "";
if (client is DurableClient durableClient)
{
var instance = new OrchestrationInstance
{
InstanceId = Guid.NewGuid().ToString("N"),
ExecutionId = Guid.NewGuid().ToString(),
};
// Create the ExecutionStartedEvent
ExecutionStartedEvent executionStartedEvent = new ExecutionStartedEvent(-1, json)
{
Name = functionName,
OrchestrationInstance = instance,
};
string traceParent = GetHeaderValueFromHeaders("traceparent", request.Headers);
string traceState = GetHeaderValueFromHeaders("tracestate", request.Headers);
if (traceParent != null)
{
ActivityContext.TryParse(traceParent, traceState, out ActivityContext parentActivityContext);
using Activity scheduleOrchestrationActivity = StartActivityForNewOrchestration(executionStartedEvent, parentActivityContext);
}
else
{
using Activity scheduleOrchestrationActivity = StartActivityForNewOrchestration(executionStartedEvent, default);
}
await durableClient.DurabilityProvider.CreateTaskOrchestrationAsync(
new TaskMessage
{
Event = executionStartedEvent,
OrchestrationInstance = instance,
},
this.config.Options.OverridableExistingInstanceStates.ToDedupeStatuses());
id = instance.InstanceId;
}
else
{
id = await client.StartNewAsync(functionName, instanceId, input);
}
TryGetTimeSpanQueryParameterValue(queryNameValuePairs, TimeoutParameter, out TimeSpan? timeout);
TryGetTimeSpanQueryParameterValue(queryNameValuePairs, PollingInterval, out TimeSpan? pollingInterval);
// for durability providers that support poll-free waiting, we override the specified polling interval
if (client is DurableClient pollFreeDurableClient && pollFreeDurableClient.DurabilityProvider.SupportsPollFreeWait)
{
pollingInterval = timeout;
}
if (timeout.HasValue && pollingInterval.HasValue)
{
return await client.WaitForCompletionOrCreateCheckStatusResponseAsync(request, id, timeout, pollingInterval);
}
else
{
return client.CreateCheckStatusResponse(request, id);
}
}
catch (JsonReaderException e)
{
return request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid JSON content", e);
}
}