6.演示页分析
6.1 ASPX的返回值
这几个示例都有些相同的地方,例如它们都是把计算结果转换输出到临时目录下的某个临时的HTML文件,就算大功告成了.Response.ContentType = "text/plain";
6.2 临时目录
在示例中,报表服务将结果输出到Temp目录,和其自身的缓存目录处于同一个位置,试想一下,如果用的次数多了,垃圾文件就越来越多,服务器磁盘空间会被耗尽,为此我们专门增加了一个全局函数:CacheDirUtility,当您报表服务创建成功后,可以调用这个函数:String ReportFilename = dll.func("CacheDirUtility", "isCreateTempFile=true;ext=htm;DeleteEarlierFile=15m;KeepMB=10");这个函数的详细文档在 "Supcan Treelist组件\12.全局函数"中,参数中的 "DeleteEarlierFile=15m;KeepMB=10" 就是表示清理垃圾,它将删除15分钟前的文件、并保证缓存垃圾不超过10MB; "isCreateTempFile=true;ext=htm" 表示生成一个唯一的.htm文件,并返回全文件名.
清理缓存需要消耗一定 CPU,建议您产生一个随机数,随机清理,不需要每次都清理.
KeepMB建议不要设得太大, 数字越大则缓存清理过程越慢.
6.3 示例3中分类汇总表查询的aspx源码分析
public void Page_Load(Object sender, EventArgs e) { //仅返回平面的串, 可用于简单的错误提示 Response.ContentType = "text/plain"; //winface.dll所在目录 (硕正服务器专版的绝对目录) String WinFacePathname = Server.MapPath("DemoWin32\\winface.dll"); //加载winface.dll DllInvoke dll = new DllInvoke(WinFacePathname); if(dll.m_hLib == IntPtr.Zero) { Response.Write("dll加载失败"); Response.End(); return; } //服务是否被其它线程打开着 if(dll.GetActiveServices( ) > 0) { Response.Write("服务器忙,请稍后再试"); Response.End(); return; } //创建报表服务 //Temp 目录的绝对路径 String TempDir = Server.MapPath("Temp"); //报表服务中,为中心数据源设定相对URL的绝对部分, 它访问的是服务器本机的中心数据源 String BaseDir = "http://localhost/supcan/"; if(dll.OpenReportService("LogSize=1000;LogLevel=2;TempDir=" +TempDir+ ";BaseDir=" + BaseDir) == false) { Response.Write("服务创建失败"); Response.End(); return; } //指定中心数据源的URL,参数是一个相对URL,相对于服务创建参数中的BaseDir,当然您也可以用绝对URL dll.func("SetSource", "reportdata/datacenter.xml"); //报表服务:打开文件 dll.func("build", Server.MapPath("..\\report\\center2-1.xml")); //计算、填充数据 dll.func("calc", ""); //生成唯一的临时文件,同时自洁临时目录 String TempFilename = dll.func("CacheDirUtility", "isCreateTempFile=true;ext=htm;DeleteEarlierFile=15m;KeepMB=10"); //报表转换成html dll.func("callfunc", "105\r\n type=htm;filename=" + TempFilename); //关闭服务 dll.CloseService(); //取得不含路径的文件名 int n = TempFilename.LastIndexOf('\\'); TempFilename = TempFilename.Substring(n+1); //拼接成URL后 Redirect Response.Redirect("http://www.mysite.cn/supcan/dotnet/temp/" + TempFilename); }