protected ReportResponse Toggle(ReportRequest request)
        {
            ReportResponse response = new ReportResponse();

            if (string.IsNullOrEmpty(request.ToggleId))
            {
                response.Status  = 2;
                response.Message = "The ToggleId can not be empty.";
                return(response);
            }
            try
            {
                ReportExecuteResult result = new ReportExecuteResult();
                LoadReport(request, ref result);
                var s = ReportClient.ToggleItemAsync(new ToggleItemRequest(request.ToggleId)).GetAwaiter().GetResult();
                if (s.Found)
                {
                    Render(request, ref result);
                    GetPageNumber(request, ref result);
                    response.Data          = SetData(result);
                    response.Data.Contents = GetContent(result.Stream, ReportSettings.ShowToolBar);
                }
                else
                {
                    response.Status  = 5;
                    response.Message = "Toggle: not found item";
                }
            }
            catch (Exception ex)
            {
                response.Status  = 1;
                response.Message = "Toggle:" + ex.Message;
            }
            return(response);
        }
        /// <summary>
        /// step 4
        /// </summary>
        /// <param name="result"></param>
        protected void GetPageNumber(ReportRequest rRequest, ref ReportExecuteResult result)
        {
            try
            {
                Versions.TryGetValue(this.ReportSettings.ReportServer, out Version version);
                if (version.Major <= SuportExportVersion)
                {
                    var request = new GetExecutionInfo2Request();

                    var response = ReportClient.GetExecutionInfo2Async(request).GetAwaiter().GetResult();
                    result.PageCount = response.executionInfo.NumPages;
                    result.PageIndex = rRequest.PageIndex;
                    result.SessionId
                            = rRequest.SessionId
                            = ReportClient.ExecutionHeader.ExecutionID
                            = response.executionInfo.ExecutionID;
                }
                else
                {
                    var request = new GetExecutionInfo3Request();

                    var response = ReportClient.GetExecutionInfo3Async(request).GetAwaiter().GetResult();
                    result.PageCount = response.executionInfo.NumPages;
                    result.PageIndex = rRequest.PageIndex;
                    result.SessionId
                            = rRequest.SessionId
                            = ReportClient.ExecutionHeader.ExecutionID
                            = response.executionInfo.ExecutionID;
                }
            }
            catch (Exception ex)
            {
                throw new ReportException("GetPageNumber error: " + ex.Message, ex);
            }
        }
        protected ReportData SetData(ReportExecuteResult result, bool appendStream = true)
        {
            var data = new ReportData
            {
                SessionId = result.SessionId,
                Extension = result.Extension,
                MimeType  = result.MimeType,
                PageCount = result.PageCount,
                PageIndex = result.PageIndex,
            };

            if (Versions.TryGetValue(this.ReportSettings.ReportServer, out Version version))
            {
                data.Version = version;
            }
            if (appendStream && result.Stream != null)
            {
                data.Stream = result.Stream;
            }
            if (!string.IsNullOrEmpty(result.Contents))
            {
                data.Contents = GetContent(result.Contents, ReportSettings.ShowToolBar);
            }
            return(data);
        }
        protected ReportResponse FindString(ReportRequest request)
        {
            ReportResponse response = new ReportResponse();

            if (string.IsNullOrEmpty(request.FindString))
            {
                response.Status  = 2;
                response.Message = "Search value can not be empty.";
                return(response);
            }
            try
            {
                ReportExecuteResult result = new ReportExecuteResult();
                LoadReport(request, ref result);
                Render(request, ref result);
                GetPageNumber(request, ref result);

                var request0 = new FindStringRequest
                {
                    FindValue = request.FindString,
                    StartPage = request.PageIndex,
                    EndPage   = result.PageCount
                };
                var response0 = ReportClient.FindStringAsync(request0).GetAwaiter().GetResult();
                if (response0.PageNumber > 0)
                {
                    result.PageIndex = request.PageIndex = response0.PageNumber;
                }
                else
                {
                    if (request.PageIndex > 1)
                    {
                        request0.StartPage = 1;
                    }
                    response0 = ReportClient.FindStringAsync(request0).GetAwaiter().GetResult();
                    if (response0.PageNumber < 1)
                    {
                        response.Status  = 23;
                        response.Message = "The Find Text not found in the report";
                        return(response);
                    }
                    else
                    {
                        result.PageIndex = request.PageIndex = response0.PageNumber;
                    }
                }
                Render(request, ref result);
                response.Data          = SetData(result);
                response.Data.Contents = GetContent(result.Stream, ReportSettings.ShowToolBar);
            }
            catch (Exception ex)
            {
                response.Status  = 1;
                response.Message = ex.Message;
            }
            return(response);
        }
        protected ReportResponse Display(ReportRequest request)
        {
            ReportResponse response = new ReportResponse();

            try
            {
                ReportExecuteResult result = new ReportExecuteResult();
                LoadReport(request, ref result);
                Render(request, ref result);
                GetPageNumber(request, ref result);
                response.Data = SetData(result, false);
            }
            catch (Exception ex)
            {
                response.Status  = 1;
                response.Message = ex.Message;
            }
            return(response);
        }
 /// <summary>
 /// step 2.
 /// </summary>
 protected void SetParameters(ReportRequest rRequest, ReportExecuteResult result)
 {
     if (result.ParametersRequired && rRequest.Parameters.Count == 0)
     {
         throw new ReportException("The report parameters is required.");
     }
     try
     {
         var paramenters = rRequest.Parameters.Select(t => new ParameterValue {
             Name = t.Key, Value = t.Value
         }).ToArray();
         var request  = new SetExecutionParametersRequest(paramenters, "en-us");
         var response = ReportClient.SetExecutionParametersAsync(request).GetAwaiter().GetResult();
         result.SessionId = rRequest.SessionId = response.executionInfo.ExecutionID;
     }
     catch (Exception ex)
     {
         throw new ReportException("SetParameters error: " + ex.Message, ex);
     }
 }
        protected ReportResponse Export(ReportRequest request)
        {
            ReportResponse response = new ReportResponse();

            try
            {
                ReportExecuteResult result = new ReportExecuteResult();
                LoadReport(request, ref result);
                Render(request, ref result);
                response.Data = SetData(result);

                //response.Data.FileName = fileName;
            }
            catch (Exception ex)
            {
                response.Status  = 1;
                response.Message = ex.Message;
            }
            return(response);
        }
        /// <summary>
        /// step 3.
        /// </summary>
        /// <param name="result"></param>
        protected void Render(ReportRequest rRequest, ref ReportExecuteResult result, string findString = null)
        {
            try
            {
                var    deviceInfo = GenerateDeviceInfo(rRequest);
                string format;
                Versions.TryGetValue(this.ReportSettings.ReportServer, out Version version);
                switch (rRequest.RenderType)
                {
                case ReportRenderType.Html4_0:
                    format = "Html4.0";
                    break;

                case ReportRenderType.ExcelOpenXml:
                    if (version.Major < SuportExportVersion)
                    {
                        format = ReportRenderType.Excel.ToString();
                    }
                    else
                    {
                        format = ReportRenderType.ExcelOpenXml.ToString();
                    }
                    break;

                case ReportRenderType.WordOpenXml:
                    if (version.Major < SuportExportVersion)
                    {
                        format = ReportRenderType.Word.ToString();
                    }
                    else
                    {
                        format = ReportRenderType.WordOpenXml.ToString();
                    }
                    break;

                default:
                    format = rRequest.RenderType.ToString();
                    break;
                }
                var strDeviceInfo = deviceInfo.ToString();

                //strDeviceInfo = @"<DeviceInfo><HTMLFragment>true</HTMLFragment><Section>0</Section></DeviceInfo>";

                var request  = new Render2Request(format, strDeviceInfo, ReportExecutionService.PageCountMode.Actual);
                var response = ReportClient.Render2Async(request).GetAwaiter().GetResult();
                if (rRequest.RenderType == ReportRenderType.Html4_0 || rRequest.RenderType == ReportRenderType.Html5)
                {
                    StringBuilder sb     = new StringBuilder(Encoding.UTF8.GetString(response.Result));
                    Regex         reg    = new Regex("(<img [^>]*? src=\"([^\"]+&rs%3AImageID=([^\"']+))\")", RegexOptions.IgnoreCase);
                    var           matchs = reg.Match(sb.ToString());
                    while (matchs.Success)
                    {
                        var a   = matchs.Result("$1");
                        var b   = matchs.Result("$2");
                        var c   = matchs.Result("$3");
                        var cc  = ReportClient.RenderStreamAsync(new RenderStreamRequest(format, c, strDeviceInfo)).GetAwaiter().GetResult();
                        var img = $"data:{cc.MimeType};base64,{Convert.ToBase64String(cc.Result)}";
                        var aa  = a.Replace(b, img);
                        sb.Replace(a, aa);
                        matchs = matchs.NextMatch();
                    }
                    result.Contents = sb.ToString();
                }
                result.Stream    = response.Result;
                result.Encoding  = response.Encoding;
                result.Extension = response.Extension;
                result.MimeType  = response.MimeType;
            }
            catch (Exception ex)
            {
                throw new ReportException("Render error: " + ex.Message, ex);
            }
        }
        /// <summary>
        /// step 1
        /// </summary>
        protected void LoadReport(ReportRequest request, ref ReportExecuteResult result)
        {
            if (string.IsNullOrEmpty(request.Path))
            {
                throw new ReportException("Please set ReportPath to execute.");
            }
            try
            {
                if (!string.IsNullOrEmpty(request.SessionId))
                {
                    try
                    {
                        if (request.Reset)
                        {
                            var r = ReportClient.ResetExecutionAsync(new ResetExecutionRequest()).GetAwaiter().GetResult();
                            result.SessionId = r.executionInfo.ExecutionID;
                        }
                        ReportClient.ExecutionHeader.ExecutionID = request.SessionId;
                        var rr = ReportClient.GetExecutionInfoAsync(new GetExecutionInfoRequest()).GetAwaiter().GetResult();
                    }
                    catch { request.SessionId = null; }
                }
                if (string.IsNullOrEmpty(request.SessionId))
                {
                    LoadReportRequest  request0 = new LoadReportRequest(request.Path, null);
                    LoadReportResponse response = ReportClient.LoadReportAsync(request0).GetAwaiter().GetResult();

                    try
                    {
                        var match = VersionRegex.Match(response.ServerInfoHeader.ReportServerVersion);
                        if (match.Success)
                        {
                            Versions.TryAdd(this.ReportSettings.ReportServer, Version.Parse(match.Result("$1")));
                        }
                    }
                    catch { }


                    result.ParametersRequired = response.executionInfo.ParametersRequired;
                    var dict = new Dictionary <string, string>(response.executionInfo.Parameters.Length);
                    if (response.executionInfo.Parameters.Length > 0)
                    {
                        foreach (var p in response.executionInfo.Parameters)
                        {
                            if (p.DefaultValues != null && p.DefaultValues.Length > 0)
                            {
                                dict[p.Name] = p.DefaultValues.SingleOrDefault();
                            }
                            if (request.Parameters.ContainsKey(p.Name))
                            {
                                dict[p.Name] = request.Parameters[p.Name];
                            }
                        }
                    }
                    request.Parameters = dict;
                    result.SessionId   = request.SessionId = response.executionInfo.ExecutionID;
                    //ReportClient.ToggleItemAsync()
                    SetParameters(request, result);
                }
            }
            catch (Exception ex)
            {
                throw new ReportException("LoadReport error: " + ex.Message, ex);
            }
        }