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;
            }
        }