6.演示页分析

硕正主页的在线演示中有移动应用的示例，每个示例解决的问题不尽相同，下面我们对其进行分析。
在线演示都是以aspx书写的，C#源码用到了前面的非托管代码的封装类，这里不再分析了。

6.1 ASPX的返回值

这几个示例都有些相同的地方，例如它们都是把计算结果转换输出到临时目录下的某个临时的HTML文件，就算大功告成了.
在例一和例二中，aspx仅返回这个临时文件对应的URL, 浏览器获得这个URL后，将其以二维码方式在页面中展现，以便手机访问；
在例三中，aspx用 Response.Redirect( )重定位函数，引导手机指向这个URL.
所以，我们可以在aspx中设定Content-Type为纯文本就行，不需要返回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( ) > 5) {
      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);
    }