6.演示页分析
硕正主页的在线演示中有移动应用的示例,每个示例解决的问题不尽相同,下面我们对其进行分析。
在线演示都是以aspx书写的,C#源码用到了前面的非托管代码的封装类,这里不再分析了。
1.ASPX的返回值
这几个示例都有些相同的地方,例如它们都是把计算结果转换输出到临时目录下的某个临时的HTML文件,就算大功告成了.
在例一和例二中,aspx仅返回这个临时文件对应的URL, 浏览器获得这个URL后,将其以二维码方式在页面中展现,以便手机访问;
在例三中,aspx用 Response.Redirect( )重定位函数,引导手机指向这个URL.
所以,我们可以在aspx中设定Content-Type为纯文本就行,不需要返回HTML:
Response.ContentType = "text/plain";
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建议不要设得太大, 数字越大则缓存清理过程越慢;
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;
}
//报表服务:打开文件
dll.func("build", Server.MapPath("..\\report\\center2.xml"));
//指定中心数据源的URL,参数是一个相对URL,相对于服务创建参数中的BaseDir,当然您也可以用绝对URL
dll.func("SetSource", "reportdata/datacenter.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);
}