/// <summary> /// Executes the <see cref="PartialJsonResult"/> and writes the response. /// </summary> /// <param name="context">The <see cref="ActionContext"/>.</param> /// <param name="result">The <see cref="PartialJsonResult"/>.</param> /// <returns>A <see cref="Task"/> which will complete when writing has completed.</returns> public async Task ExecuteAsync(ActionContext context, PartialJsonResult result) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (result == null) { throw new ArgumentNullException(nameof(result)); } var jsonSerializerSettings = this.GetSerializerSettings(result); var request = context.HttpContext.Request; var response = context.HttpContext.Response; var fieldsParserResult = this.fieldsParser.Parse(request); if (fieldsParserResult.HasError && !this.jsonOptions.IgnoreParseErrors) { response.StatusCode = 400; return; } ResponseContentTypeHelper.ResolveContentTypeAndEncoding(result.ContentType, response.ContentType, DefaultContentType, out var resolvedContentType, out var resolvedContentTypeEncoding); response.ContentType = resolvedContentType; if (result.StatusCode != null) { response.StatusCode = result.StatusCode.Value; } Log.PartialJsonResultExecuting(this.logger, result.Value); var responseStream = response.Body; FileBufferingWriteStream fileBufferingWriteStream = null; if (!this.mvcOptions.SuppressOutputFormatterBuffering) { fileBufferingWriteStream = new FileBufferingWriteStream(); responseStream = fileBufferingWriteStream; } try { await using (var writer = this.writerFactory.CreateWriter(responseStream, resolvedContentTypeEncoding)) { using var jsonWriter = new JsonTextWriter(writer); jsonWriter.ArrayPool = this.charPool; jsonWriter.CloseOutput = false; jsonWriter.AutoCompleteOnClose = false; var jsonSerializer = JsonSerializer.Create(jsonSerializerSettings); var value = result.Value; if (result.Value is IAsyncEnumerable <object> asyncEnumerable) { Log.BufferingAsyncEnumerable(this.logger, asyncEnumerable); value = await this.asyncEnumerableReader.ReadAsync(asyncEnumerable); } if (fieldsParserResult.IsFieldsSet && !fieldsParserResult.HasError) { jsonSerializer.Serialize(jsonWriter, result.Value, path => fieldsParserResult.Fields.Matches(path, this.jsonOptions.IgnoreCase)); } else { jsonSerializer.Serialize(jsonWriter, result.Value); } } if (fileBufferingWriteStream != null) { await fileBufferingWriteStream.DrainBufferAsync(response.Body); } } finally { if (fileBufferingWriteStream != null) { await fileBufferingWriteStream.DisposeAsync(); } } }
/// <summary> /// Executes the <see cref="PartialJsonResult"/> and writes the response. /// </summary> /// <param name="context">The <see cref="ActionContext"/>.</param> /// <param name="result">The <see cref="PartialJsonResult"/>.</param> /// <returns>A <see cref="Task"/> which will complete when writing has completed.</returns> public Task ExecuteAsync(ActionContext context, PartialJsonResult result) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (result == null) { throw new ArgumentNullException(nameof(result)); } var request = context.HttpContext.Request; var response = context.HttpContext.Response; Fields?fields; if (!request.TryGetFields(out fields)) { response.StatusCode = 400; return(TaskCache.CompletedTask); } string resolvedContentType = null; Encoding resolvedContentTypeEncoding = null; ResponseContentTypeHelper.ResolveContentTypeAndEncoding( result.ContentType, response.ContentType, DefaultContentType, out resolvedContentType, out resolvedContentTypeEncoding); response.ContentType = resolvedContentType; if (result.StatusCode != null) { response.StatusCode = result.StatusCode.Value; } var serializerSettings = result.SerializerSettings ?? Options.SerializerSettings; Logger.PartialJsonResultExecuting(result.Value); using (var writer = WriterFactory.CreateWriter(response.Body, resolvedContentTypeEncoding)) { using (var jsonWriter = new JsonTextWriter(writer)) { jsonWriter.ArrayPool = _charPool; jsonWriter.CloseOutput = false; var jsonSerializer = JsonSerializer.Create(serializerSettings); if (fields.HasValue) { jsonSerializer.Serialize(jsonWriter, result.Value, path => fields.Value.Matches(path, this.Options.IgnoreCase)); } else { jsonSerializer.Serialize(jsonWriter, result.Value); } } } return(TaskCache.CompletedTask); }