public static ScriptInvocationResult ToScriptInvocationResult(this HttpScriptInvocationResult httpScriptInvocationResult, ScriptInvocationContext scriptInvocationContext) { ScriptInvocationResult scriptInvocationResult = new ScriptInvocationResult() { Outputs = new Dictionary <string, object>() }; foreach (var outputBindingMetadata in scriptInvocationContext.FunctionMetadata.OutputBindings) { object outputValue = GetOutputValue(outputBindingMetadata.Name, outputBindingMetadata.Type, outputBindingMetadata.DataType, httpScriptInvocationResult.Outputs); if (outputValue != null) { scriptInvocationResult.Outputs[outputBindingMetadata.Name] = outputValue; } } if (httpScriptInvocationResult.ReturnValue != null) { BindingMetadata returnParameterBindingMetadata = GetBindingMetadata(ScriptConstants.SystemReturnParameterBindingName, scriptInvocationContext); if (returnParameterBindingMetadata != null) { scriptInvocationResult.Return = GetBindingValue(returnParameterBindingMetadata.DataType, httpScriptInvocationResult.ReturnValue); } } return(scriptInvocationResult); }
internal async Task ProcessDefaultInvocationRequest(ScriptInvocationContext scriptInvocationContext) { try { HttpScriptInvocationContext httpScriptInvocationContext = await scriptInvocationContext.ToHttpScriptInvocationContext(); string uri = BuildAndGetUri(scriptInvocationContext.FunctionMetadata.Name); // Build httpRequestMessage from scriptInvocationContext using (HttpRequestMessage httpRequestMessage = httpScriptInvocationContext.ToHttpRequestMessage(uri)) { AddHeaders(httpRequestMessage, scriptInvocationContext.ExecutionContext.InvocationId.ToString()); _logger.LogDebug("Sending http request for function:{functionName} invocationId:{invocationId}", scriptInvocationContext.FunctionMetadata.Name, scriptInvocationContext.ExecutionContext.InvocationId); HttpResponseMessage response = await _httpClient.SendAsync(httpRequestMessage); _logger.LogDebug("Received http response for function:{functionName} invocationId:{invocationId}", scriptInvocationContext.FunctionMetadata.Name, scriptInvocationContext.ExecutionContext.InvocationId); // Only process output bindings if response is succeess code response.EnsureSuccessStatusCode(); HttpScriptInvocationResult httpScriptInvocationResult = await response.Content.ReadAsAsync <HttpScriptInvocationResult>(); if (httpScriptInvocationResult != null) { if (httpScriptInvocationResult.Outputs == null || !httpScriptInvocationResult.Outputs.Any()) { _logger.LogWarning("Outputs not set on http response for invocationId:{invocationId}", scriptInvocationContext.ExecutionContext.InvocationId); } if (httpScriptInvocationResult.ReturnValue == null) { _logger.LogWarning("ReturnValue not set on http response for invocationId:{invocationId}", scriptInvocationContext.ExecutionContext.InvocationId); } ProcessLogsFromHttpResponse(scriptInvocationContext, httpScriptInvocationResult); ScriptInvocationResult scriptInvocationResult = httpScriptInvocationResult.ToScriptInvocationResult(scriptInvocationContext); scriptInvocationContext.ResultSource.SetResult(scriptInvocationResult); } } } catch (Exception responseEx) { scriptInvocationContext.ResultSource.TrySetException(responseEx); } }
public static ScriptInvocationResult ToScriptInvocationResult(this HttpScriptInvocationResult httpScriptInvocationResult, ScriptInvocationContext scriptInvocationContext) { ScriptInvocationResult scriptInvocationResult = new ScriptInvocationResult() { Outputs = new Dictionary <string, object>() }; if (httpScriptInvocationResult.Outputs != null && httpScriptInvocationResult.Outputs.Any()) { foreach (var outputFromHttpWorker in httpScriptInvocationResult.Outputs) { BindingMetadata outputBindingMetadata = GetBindingMetadata(outputFromHttpWorker.Key, scriptInvocationContext); scriptInvocationResult.Outputs[outputFromHttpWorker.Key] = GetOutputValue(outputBindingMetadata, outputFromHttpWorker.Value); } } if (httpScriptInvocationResult.ReturnValue != null) { BindingMetadata returnParameterBindingMetadata = GetBindingMetadata(ScriptConstants.SystemReturnParameterBindingName, scriptInvocationContext); scriptInvocationResult.Return = GetOutputValue(returnParameterBindingMetadata, httpScriptInvocationResult.ReturnValue); } return(scriptInvocationResult); }
internal void ProcessLogsFromHttpResponse(ScriptInvocationContext scriptInvocationContext, HttpScriptInvocationResult invocationResult) { if (scriptInvocationContext == null) { throw new ArgumentNullException(nameof(scriptInvocationContext)); } if (invocationResult == null) { throw new ArgumentNullException(nameof(invocationResult)); } if (invocationResult.Logs != null) { // Restore the execution context from the original invocation. This allows AsyncLocal state to flow to loggers. System.Threading.ExecutionContext.Run(scriptInvocationContext.AsyncExecutionContext, (s) => { foreach (var userLog in invocationResult.Logs) { scriptInvocationContext.Logger?.LogInformation(userLog); } }, null); } }