// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Core; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Mvc { /// /// An that returns a Accepted (202) response with a Location header. /// public class AcceptedAtActionResult : ObjectResult { /// /// Initializes a new instance of the with the values /// provided. /// /// The name of the action to use for generating the URL. /// The name of the controller to use for generating the URL. /// The route data to use for generating the URL. /// The value to format in the entity body. public AcceptedAtActionResult( string actionName, string controllerName, object routeValues, object value) : base(value) { ActionName = actionName; ControllerName = controllerName; RouteValues = routeValues == null ? null : new RouteValueDictionary(routeValues); StatusCode = StatusCodes.Status202Accepted; } /// /// Gets or sets the used to generate URLs. /// public IUrlHelper UrlHelper { get; set; } /// /// Gets or sets the name of the action to use for generating the URL. /// public string ActionName { get; set; } /// /// Gets or sets the name of the controller to use for generating the URL. /// public string ControllerName { get; set; } /// /// Gets or sets the route data to use for generating the URL. /// public RouteValueDictionary RouteValues { get; set; } /// public override void OnFormatting(ActionContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } base.OnFormatting(context); var request = context.HttpContext.Request; var urlHelper = UrlHelper; if (urlHelper == null) { var services = context.HttpContext.RequestServices; urlHelper = services.GetRequiredService().GetUrlHelper(context); } var url = urlHelper.Action( ActionName, ControllerName, RouteValues, request.Scheme, request.Host.ToUriComponent()); if (string.IsNullOrEmpty(url)) { throw new InvalidOperationException(Resources.NoRoutesMatched); } context.HttpContext.Response.Headers[HeaderNames.Location] = url; } } }