public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { if (_contextProvider.GetContexts().Count > 0) { FragmentResponseFilterContext filterContext = new FragmentResponseFilterContext { ResponseHtml = Encoding.Default.GetString(buffer.Take(count).ToArray()), FlushIndex = FlusIndex, BodyStream = BodyStream }; _responseFilters?.ForEach(f => f.OnRendering(filterContext)); byte[] responseBytes = Encoding.Default.GetBytes(filterContext.ResponseHtml); _logger.Info($"Chunk size : {responseBytes.Length}"); await BodyStream.WriteAsync(responseBytes, offset, responseBytes.Length, cancellationToken); await FlushAsync(cancellationToken); _responseFilters?.ForEach(f => f.OnRendered(filterContext)); } else { await BodyStream.WriteAsync(buffer, offset, count, cancellationToken); } }
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { output.TagName = "div"; Fragment fragment = await _fragmentResolver.ResolveAsync(Name); var fragmentOptions = _fragmentOptionsProvider.GetFragmentOptions(fragment); var fragmentContext = new FragmentContext { Fragment = fragment, OutputStream = ViewContext.HttpContext.Response.Body, Model = Model, FragmentOptions = fragmentOptions }; _fragmentContextProvider.AddContext(fragmentContext); _fragmentLogger.Info($"Executing fragment {Name}. Model : {JsonConvert.SerializeObject(fragmentContext.Model)}"); var placeHolderViewName = fragmentOptions?.PlaceHolderViewName; if (fragmentOptions?.IsSync == true || fragmentOptions?.IsSyncOnAjax == true && IsAjaxRequest(ViewContext.HttpContext.Request)) { output.SuppressOutput(); throw new NotImplementedException("Sync fragments are not implemented yet."); } else { fragmentContext.PlaceHolderId = Guid.NewGuid().ToString(); var placeHolderHtml = string.IsNullOrEmpty(placeHolderViewName) ? await fragment.GetPlaceHolderHtmlAsync() : await _viewRenderer.RenderAsync(placeHolderViewName, null); if (string.IsNullOrEmpty(placeHolderHtml) == false) { output.Content.SetHtmlContent(placeHolderHtml); } output.Attributes.SetAttribute(Constants.HtmlIdAttribute, fragmentContext.PlaceHolderId); output.TagMode = TagMode.StartTagAndEndTag; } }