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