/// <summary> /// Executes the <see cref="ObjectResult"/>. /// </summary> /// <param name="context">The <see cref="ActionContext"/> for the current request.</param> /// <param name="result">The <see cref="ObjectResult"/>.</param> /// <returns> /// A <see cref="Task"/> which will complete once the <see cref="ObjectResult"/> is written to the response. /// </returns> public virtual Task ExecuteAsync(ActionContext context, ObjectResult result) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (result == null) { throw new ArgumentNullException(nameof(result)); } ValidateContentTypes(result.ContentTypes); var formatters = result.Formatters; if (formatters == null || formatters.Count == 0) { formatters = GetDefaultFormatters(); } var objectType = result.DeclaredType; if (objectType == null || objectType == typeof(object)) { objectType = result.Value?.GetType(); } ; var formatterContext = new OutputFormatterWriteContext( context.HttpContext, WriterFactory, objectType, result.Value); var selectedFormatter = SelectFormatter(formatterContext, result.ContentTypes, formatters); if (selectedFormatter == null) { // No formatter supports this. Logger.LogWarning("No output formatter was found to write the response."); context.HttpContext.Response.StatusCode = StatusCodes.Status406NotAcceptable; return(TaskCache.CompletedTask); } Logger.LogVerbose( "Selected output formatter '{OutputFormatter}' and content type " + "'{ContentType}' to write the response.", selectedFormatter.GetType().FullName, formatterContext.ContentType); Logger.ObjectResultExecuting(context); result.OnFormatting(context); return(selectedFormatter.WriteAsync(formatterContext)); }
/// <summary> /// Executes the <see cref="ObjectResult"/>. /// </summary> /// <param name="context">The <see cref="ActionContext"/> for the current request.</param> /// <param name="result">The <see cref="ObjectResult"/>.</param> /// <returns> /// A <see cref="Task"/> which will complete once the <see cref="ObjectResult"/> is written to the response. /// </returns> public virtual Task ExecuteAsync(ActionContext context, ObjectResult result) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (result == null) { throw new ArgumentNullException(nameof(result)); } // If the user sets the content type both on the ObjectResult (example: by Produces) and Response object, // then the one set on ObjectResult takes precedence over the Response object if (result.ContentTypes == null || result.ContentTypes.Count == 0) { var responseContentType = context.HttpContext.Response.ContentType; if (!string.IsNullOrEmpty(responseContentType)) { if (result.ContentTypes == null) { result.ContentTypes = new MediaTypeCollection(); } result.ContentTypes.Add(responseContentType); } } ValidateContentTypes(result.ContentTypes); var formatters = result.Formatters; if (formatters == null || formatters.Count == 0) { formatters = OptionsFormatters; // Complain about MvcOptions.OutputFormatters only if the result has an empty Formatters. Debug.Assert(formatters != null, "MvcOptions.OutputFormatters cannot be null."); if (formatters.Count == 0) { throw new InvalidOperationException(Resources.FormatOutputFormattersAreRequired( typeof(MvcOptions).FullName, nameof(MvcOptions.OutputFormatters), typeof(IOutputFormatter).FullName)); } } var objectType = result.DeclaredType; if (objectType == null || objectType == typeof(object)) { objectType = result.Value?.GetType(); } var formatterContext = new OutputFormatterWriteContext( context.HttpContext, WriterFactory, objectType, result.Value); var selectedFormatter = SelectFormatter(formatterContext, result.ContentTypes, formatters); if (selectedFormatter == null) { // No formatter supports this. Logger.NoFormatter(formatterContext); context.HttpContext.Response.StatusCode = StatusCodes.Status406NotAcceptable; return(TaskCache.CompletedTask); } Logger.FormatterSelected(selectedFormatter, formatterContext); Logger.ObjectResultExecuting(context); result.OnFormatting(context); return(selectedFormatter.WriteAsync(formatterContext)); }
/// <summary> /// Executes the <see cref="ObjectResult"/>. /// </summary> /// <param name="context">The <see cref="ActionContext"/> for the current request.</param> /// <param name="result">The <see cref="ObjectResult"/>.</param> /// <returns> /// A <see cref="Task"/> which will complete once the <see cref="ObjectResult"/> is written to the response. /// </returns> public virtual Task ExecuteAsync(ActionContext context, ObjectResult result) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (result == null) { throw new ArgumentNullException(nameof(result)); } ValidateContentTypes(result.ContentTypes); var formatters = result.Formatters; if (formatters == null || formatters.Count == 0) { formatters = GetDefaultFormatters(); } var objectType = result.DeclaredType; if (objectType == null || objectType == typeof(object)) { objectType = result.Value?.GetType(); }; var formatterContext = new OutputFormatterWriteContext( context.HttpContext, WriterFactory, objectType, result.Value); var selectedFormatter = SelectFormatter(formatterContext, result.ContentTypes, formatters); if (selectedFormatter == null) { // No formatter supports this. Logger.LogWarning("No output formatter was found to write the response."); context.HttpContext.Response.StatusCode = StatusCodes.Status406NotAcceptable; return TaskCache.CompletedTask; } Logger.LogVerbose( "Selected output formatter '{OutputFormatter}' and content type " + "'{ContentType}' to write the response.", selectedFormatter.GetType().FullName, formatterContext.ContentType); Logger.ObjectResultExecuting(context); result.OnFormatting(context); return selectedFormatter.WriteAsync(formatterContext); }
/// <summary> /// Executes the <see cref="ObjectResult"/>. /// </summary> /// <param name="context">The <see cref="ActionContext"/> for the current request.</param> /// <param name="result">The <see cref="ObjectResult"/>.</param> /// <returns> /// A <see cref="Task"/> which will complete once the <see cref="ObjectResult"/> is written to the response. /// </returns> public virtual Task ExecuteAsync(ActionContext context, ObjectResult result) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (result == null) { throw new ArgumentNullException(nameof(result)); } // If the user sets the content type both on the ObjectResult (example: by Produces) and Response object, // then the one set on ObjectResult takes precedence over the Response object if (result.ContentTypes == null || result.ContentTypes.Count == 0) { var responseContentType = context.HttpContext.Response.ContentType; if (!string.IsNullOrEmpty(responseContentType)) { if (result.ContentTypes == null) { result.ContentTypes = new List <MediaTypeHeaderValue>(); } result.ContentTypes.Add(MediaTypeHeaderValue.Parse(responseContentType)); } } ValidateContentTypes(result.ContentTypes); var formatters = result.Formatters; if (formatters == null || formatters.Count == 0) { formatters = OptionsFormatters; } var objectType = result.DeclaredType; if (objectType == null || objectType == typeof(object)) { objectType = result.Value?.GetType(); } var formatterContext = new OutputFormatterWriteContext( context.HttpContext, WriterFactory, objectType, result.Value); var selectedFormatter = SelectFormatter(formatterContext, result.ContentTypes, formatters); if (selectedFormatter == null) { // No formatter supports this. Logger.NoFormatter(formatterContext); context.HttpContext.Response.StatusCode = StatusCodes.Status406NotAcceptable; return(TaskCache.CompletedTask); } Logger.FormatterSelected(selectedFormatter, formatterContext); Logger.ObjectResultExecuting(context); result.OnFormatting(context); return(selectedFormatter.WriteAsync(formatterContext)); }
/// <summary> /// Executes the <see cref="ObjectResult"/>. /// </summary> /// <param name="context">The <see cref="ActionContext"/> for the current request.</param> /// <param name="result">The <see cref="ObjectResult"/>.</param> /// <returns> /// A <see cref="Task"/> which will complete once the <see cref="ObjectResult"/> is written to the response. /// </returns> public virtual Task ExecuteAsync(ActionContext context, ObjectResult result) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (result == null) { throw new ArgumentNullException(nameof(result)); } // If the user sets the content type both on the ObjectResult (example: by Produces) and Response object, // then the one set on ObjectResult takes precedence over the Response object if (result.ContentTypes == null || result.ContentTypes.Count == 0) { var responseContentType = context.HttpContext.Response.ContentType; if (!string.IsNullOrEmpty(responseContentType)) { if (result.ContentTypes == null) { result.ContentTypes = new MediaTypeCollection(); } result.ContentTypes.Add(responseContentType); } } ValidateContentTypes(result.ContentTypes); var formatters = result.Formatters; if (formatters == null || formatters.Count == 0) { formatters = OptionsFormatters; } var objectType = result.DeclaredType; if (objectType == null || objectType == typeof(object)) { objectType = result.Value?.GetType(); } var formatterContext = new OutputFormatterWriteContext( context.HttpContext, WriterFactory, objectType, result.Value); var selectedFormatter = SelectFormatter(formatterContext, result.ContentTypes, formatters); if (selectedFormatter == null) { // No formatter supports this. Logger.NoFormatter(formatterContext); context.HttpContext.Response.StatusCode = StatusCodes.Status406NotAcceptable; return TaskCache.CompletedTask; } Logger.FormatterSelected(selectedFormatter, formatterContext); Logger.ObjectResultExecuting(context); result.OnFormatting(context); return selectedFormatter.WriteAsync(formatterContext); }