async Task <DurableHttpResponse> IDurableOrchestrationContext.CallHttpAsync(DurableHttpRequest req) { DurableHttpResponse durableHttpResponse = await this.ScheduleDurableHttpActivityAsync(req); HttpStatusCode currStatusCode = durableHttpResponse.StatusCode; while (currStatusCode == HttpStatusCode.Accepted && req.AsynchronousPatternEnabled) { Dictionary <string, StringValues> headersDictionary = new Dictionary <string, StringValues>(durableHttpResponse.Headers); DateTime fireAt = default(DateTime); if (headersDictionary.ContainsKey("Retry-After")) { fireAt = this.InnerContext.CurrentUtcDateTime.AddSeconds(int.Parse(headersDictionary["Retry-After"])); } else { fireAt = this.InnerContext.CurrentUtcDateTime.AddMilliseconds(this.Config.Options.HttpSettings.DefaultAsyncRequestSleepTimeMilliseconds); } this.IncrementActionsOrThrowException(); await this.InnerContext.CreateTimer(fireAt, CancellationToken.None); DurableHttpRequest durableAsyncHttpRequest = this.CreateHttpRequestMessageCopy(req, durableHttpResponse.Headers["Location"]); durableHttpResponse = await this.ScheduleDurableHttpActivityAsync(durableAsyncHttpRequest); currStatusCode = durableHttpResponse.StatusCode; } return(durableHttpResponse); }
public async override Task <string> RunAsync(TaskContext context, string rawInput) { DurableHttpRequest durableHttpRequest = ReconstructDurableHttpRequest(rawInput); HttpRequestMessage requestMessage = await this.ConvertToHttpRequestMessage(durableHttpRequest); HttpResponseMessage response; if (durableHttpRequest.Timeout == null) { response = await this.httpClient.SendAsync(requestMessage); } else { try { using (CancellationTokenSource cts = new CancellationTokenSource()) { cts.CancelAfter(durableHttpRequest.Timeout.Value); response = await this.httpClient.SendAsync(requestMessage, cts.Token); } } catch (OperationCanceledException ex) { TimeoutException e = new TimeoutException(ex.Message + $" Reached user specified timeout: {durableHttpRequest.Timeout.Value}."); string details = Utils.SerializeCause(e, this.config.ErrorDataConverter); throw new TaskFailureException(e.Message, e, details); } } DurableHttpResponse durableHttpResponse = await DurableHttpResponse.CreateDurableHttpResponseWithHttpResponseMessage(response); return(JsonConvert.SerializeObject(durableHttpResponse)); }
/// <summary> /// Creates a DurableHttpResponse from an HttpResponseMessage. /// </summary> /// <param name="httpResponseMessage">HttpResponseMessage returned from the HTTP call.</param> /// <returns>A <see cref="Task{TResult}"/> representing the result of the asynchronous operation.</returns> public static async Task <DurableHttpResponse> CreateDurableHttpResponseWithHttpResponseMessage(HttpResponseMessage httpResponseMessage) { DurableHttpResponse durableHttpResponse = new DurableHttpResponse( statusCode: httpResponseMessage.StatusCode, headers: CreateStringValuesHeaderDictionary(httpResponseMessage.Headers), content: await httpResponseMessage.Content.ReadAsStringAsync()); return(durableHttpResponse); }
public async override Task <string> RunAsync(TaskContext context, string rawInput) { HttpRequestMessage requestMessage = await this.ReconstructHttpRequestMessage(rawInput); HttpResponseMessage response = await this.httpClient.SendAsync(requestMessage); DurableHttpResponse durableHttpResponse = await DurableHttpResponse.CreateDurableHttpResponseWithHttpResponseMessage(response); return(JsonConvert.SerializeObject(durableHttpResponse)); }
private async Task <DurableHttpResponse> ScheduleDurableHttpActivityAsync(DurableHttpRequest req) { DurableHttpResponse durableHttpResponse = await this.CallDurableTaskFunctionAsync <DurableHttpResponse>( functionName : HttpOptions.HttpTaskActivityReservedName, functionType : FunctionType.Activity, oneWay : false, instanceId : null, operation : null, retryOptions : null, input : req); return(durableHttpResponse); }