예제 #1
0
        private static string PrepareAndGetDeviceInfo(LocalReport report, ReportSettings settings)
        {
            /*
             * برای افزایش سرعت در حالت سندباکس کارهای زیاد انجام دادیم ولی نشد.
             * توجه!!!!! خیلی جالب آنکه اجرا در لوکال از سرور های تست
             * خیلی سریعتیر است اما بعد از پابلیش در سرور همچنان کند است
             *
             * کارهای زیر انجام شد :
             *
             * ----------------------------- کار 1 --------------------------------------------------------------
             *
             * کد زیر دقیقا در همین تابع و در همین ابندای آن قرار داده شد. کد کار می کند ولی تاثیری در سرعت نداشت :
             *
             *
             *  PermissionSet permissions = new PermissionSet(PermissionState.Unrestricted);
             *  permissions.AddPermission(new SecurityPermission(PermissionState.Unrestricted));
             *  permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.AllFlags));
             *  permissions.AddPermission(new FileIOPermission(PermissionState.Unrestricted));
             *  permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
             *
             *  report.SetBasePermissionsForSandboxAppDomain(permissions);
             *
             *  var customAssembly = typeof(ReportsLoader).Assembly;// "Greewf.Reporting, Culture=neutral, PublicKeyToken=ebf2eb006a1f561b";
             *  StrongName assemblyStrongName = CreateStrongName(customAssembly);
             *  report.AddFullTrustModuleInSandboxAppDomain(assemblyStrongName);
             *
             *
             *
             * ----------------------------- کار 2 --------------------------------------------------------------
             *
             * همچنین تنظیمات زیر را هم در وب کانفیگ پروژه اجرایی گذاشتیم ولی باز تاثیری نداشت :
             * این موارد طبق این پست ها بود : https://stackoverflow.com/a/26733816/790811 & https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/ee191568(v=vs.100)
             *
             * در بخش configuration:
             *
             * <startup uselegacyv2runtimeactivationpolicy="true">
             * </startup>
             *
             * و در بخش runtime:
             *  <NetFx40_LegacySecurityPolicy enabled="true" />
             *
             *
             * همچنین در اینجا یک پست هست که توضیح با بالاترین ووت هم خواندنی است : https://social.msdn.microsoft.com/Forums/sqlserver/en-US/6d89e2ce-3528-465f-9740-7e22aa7b7aae/slow-performance-with-dynamic-grouping-and-reportviewer-in-local-mode?forum=sqlreportingservices
             *
             *
             *
             * ----------------------------- کار 3 --------------------------------------------------------------
             * در کانفیگ این کار را هم طبق پست روبرو انجام دادیم. سرعت به طرز وحشتناکی خوب شد : https://social.msdn.microsoft.com/Forums/en-US/b35bf409-4d73-4506-b13b-2629b1216773/reportviewer-in-net-4-even-possible-legacycasmodelquottruequot-causes-problems?forum=vsreportcontrols
             * اما محدودیت آن فراوان است
             *
             * در بخش system.web :
             *  <trust legacyCasModel="true" level="Full"/>
             * البته در صورتیکه برنامه شما یک وب سایت نیست از طریق این تنظیم runtime: (طبق لینک روبرو این تگ با NetFx40_LegacySecurityPolicy تفاوتی ندارد : https://blogs.msdn.microsoft.com/shawnfa/2009/06/12/temporarily-re-enabling-cas-policy-during-migration/)
             *  <legacyCasPolicy enabled="true" />
             *
             * در تنظیمات اسمبلی همین اسمبلی باید خط زیر را اضافه کنید : https://stackoverflow.com/a/2504341/790811
             * برای همین کار مجبور هستیم کل پروژه را جدا کنیم چراکه برای بخش های دیگر دچار مشکل می کند
             *  [assembly: AllowPartiallyTrustedCallers]
             *
             * و در کد دقیقا در همین محل عملیات زیر انجام شد :
             * var customAssembly = typeof(ReportsLoader).Assembly;
             * report.AddTrustedCodeModuleInCurrentAppDomain(customAssembly.FullName);
             *
             *
             */

            //این کد در صورتی اثر می کند که در کانفیگ برنامه تنظیم گفته شده در توضیحات انجام شده باشد
            //توجه: اسمبلی را دستی نوشتیم. دقت کنید که اگر از خود اسمبلی می گرفتیم ورژن هم داشت و ما نباید
            //در این نام آنرا به ورژن وابسته کنیم

            if (RunInLegacyCasModel)
            {
                report.AddTrustedCodeModuleInCurrentAppDomain("Greewf.Reporting, Culture=neutral, PublicKeyToken=ebf2eb006a1f561b");
            }
            else
            {
                var assembly = typeof(ReportsLoader).Assembly;
                report.AddFullTrustModuleInSandboxAppDomain(CreateStrongName(assembly));
            }


            var defaults = report.GetDefaultPageSettings();

            var marginTop    = settings.TopMargin.HasValue ? (settings.TopMargin * (1 / 2.54)) : defaults.Margins.Top / 100.0;
            var marginBottom = settings.BottomMargin.HasValue ? (settings.BottomMargin * (1 / 2.54)) : defaults.Margins.Bottom / 100.0;
            var marginLeft   = settings.LeftMargin.HasValue ? (settings.LeftMargin * (1 / 2.54)) : defaults.Margins.Left / 100.0;
            var marginRight  = settings.RightMargin.HasValue ? (settings.RightMargin * (1 / 2.54)) : defaults.Margins.Right / 100.0;

            settings.EndPage = settings.EndPage ?? settings.StartPage;

            //The DeviceInfo settings should be changed based on the reportType
            // http://msdn2.microsoft.com/en-us/library/ms155397.aspx
            // http://msdn.microsoft.com/en-us/library/hh231593.aspx
            string deviceInfo =
                "<DeviceInfo>" +
                ((settings.DpiX > 0) ? "  <DpiX>" + settings.DpiX + "</DpiX>" : "") +
                ((settings.DpiY > 0) ? "  <DpiY>" + settings.DpiY + "</DpiY>" : "") +
                "  <OutputFormat>" + settings.OutputType + "</OutputFormat>" +
                "  <PageWidth>" + (defaults.IsLandscape ? defaults.PaperSize.Height : defaults.PaperSize.Width) / 100.0 + "in</PageWidth>" +
                "  <PageHeight>" + (defaults.IsLandscape ? defaults.PaperSize.Width : defaults.PaperSize.Height) / 100.0 + "in</PageHeight>" +
                "  <MarginTop>" + marginTop + "in</MarginTop>" +
                "  <MarginLeft>" + marginLeft + "in</MarginLeft>" +
                "  <MarginRight>" + marginRight + "in</MarginRight>" +
                "  <MarginBottom>" + marginBottom + "in</MarginBottom>" +
                "  <StartPage>" + (settings.StartPage ?? 0) + "</StartPage>" +
                "  <EndPage>" + (settings.EndPage ?? 0) + "</EndPage>" +
                "  <PageBreaksMode>OnEachPage</PageBreaksMode>" +
                "  <HumanReadablePDF>" + settings.HumanReadablePdf.ToString() + "</HumanReadablePDF>";

            if (!settings.EmbedFontsInPdf)
            {
                deviceInfo += "  <EmbedFonts>None</EmbedFonts>";
            }

            deviceInfo += "</DeviceInfo>";

            return(deviceInfo);
        }