示例#1
0
        public static async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = "buildenvelope/{envelopeType}/{scenario}")]
            HttpRequest req, string envelopeType, string scenario, ILogger log)
        {
            // Get Request Details
            RequestDetails requestDetails = new RequestDetails(req, LogId);

            string logPrefix = $"{LogId}:{requestDetails.TrackingId}: ";

            // Add the tracking ID to the Response Headers
            if (!string.IsNullOrWhiteSpace(requestDetails.TrackingId))
            {
                req.HttpContext.Response.Headers[HeaderConstants.AimTrackingId] = requestDetails.TrackingId;
            }

            log.LogDebug($"{logPrefix}Called with parameters envelopeType: {envelopeType}, scenario: {scenario}, messageContentType: {requestDetails.RequestContentType}, messageContentEncoding: {requestDetails.RequestContentEncoding}, messageTransferEncoding: {requestDetails.RequestTransferEncoding}, headerTrackingId: {requestDetails.TrackingId}, clearCache: {requestDetails.ClearCache}, enableTrace: {requestDetails.EnableTrace}");

            envelopeType = envelopeType.ToLower();

            // Validate the request
            IActionResult result = ValidateRequest(envelopeType, scenario, requestDetails, logPrefix, log);

            if (result != null)
            {
                return(result);
            }

            log.LogDebug($"{logPrefix}Request parameters are valid");

            JObject envelope;

            // Switch by envelopeType
            switch (envelopeType)
            {
            case EnvelopeTypeAck:
            {
                log.LogDebug($"{logPrefix}Building an ACK envelope");
                envelope = EnvelopeBuilder.BuildAckEnvelope(requestDetails);
                break;
            }

            case EnvelopeTypeNack:
            {
                log.LogDebug($"{logPrefix}Building a NACK envelope");
                envelope = EnvelopeBuilder.BuildNackEnvelope(requestDetails);
                break;
            }

            case EnvelopeTypeDocument:
            {
                try
                {
                    log.LogDebug($"{logPrefix}Building a Content envelope");
                    envelope = await BuildDocumentEnvelopeAsync(scenario, requestDetails, logPrefix, log);

                    // Update the request TrackingId if need be
                    requestDetails.UpdateTrackingId(envelope?["header"]?["properties"]?["trackingId"]?.Value <string>());
                }
                catch (AzureResponseException arex)
                {
                    // Exception occurred
                    AzureResponseHelper.SetCustomResponseHeaders(req, arex);
                    return(AzureResponseHelper.CreateFaultObjectResult("An AzureResponseException error occurred building a Document envelope", arex, logPrefix, log));
                }
                catch (Exception ex)
                {
                    // Exception occurred
                    return(AzureResponseHelper.CreateFaultObjectResult(requestDetails, "An error occurred building a Document envelope", ex, logPrefix, log));
                }
                break;
            }

            default:
            {
                // Invalid EnvelopeType
                return(AzureResponseHelper.CreateFaultObjectResult(requestDetails, $"Invalid envelopeType parameter supplied - must be one of {string.Join(", ", s_allowedEnvelopeTypes)}", logPrefix, log));
            }
            }

            // Add TrackingId header
            if (!string.IsNullOrEmpty(requestDetails.TrackingId) && req?.HttpContext?.Response?.Headers?.ContainsKey(HeaderConstants.AimTrackingId) == false)
            {
                req?.HttpContext?.Response?.Headers?.Add(HeaderConstants.AimTrackingId, requestDetails.TrackingId);
            }

            log.LogDebug($"{logPrefix}Finished building envelope - returning response");

            return(new OkObjectResult(envelope));
        }