19f87a1901798d784fa180d1cb5085f00ee2f2d9.svn-base
3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<HTML>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<link rel="stylesheet" href="../temp1.css" type="text/css">
</head>
<body bgcolor=#ffffff vlink=#0000ff>
<div id="Tag1"/>
<br>
<font style='font-size:15pt'>6.演示页分析</font><hr color=#2266ee size=1>
硕正主页的在线演示中有移动应用的示例,每个示例解决的问题不尽相同,下面我们对其进行分析。<br>
<br>
在线演示都是以aspx书写的,C#源码用到了前面的非托管代码的封装类,这里不再分析了。<br>
<br>
<b>1.ASPX的返回值</b><br>
这几个示例都有些相同的地方,例如它们都是把计算结果转换输出到临时目录下的某个临时的HTML文件,就算大功告成了.<br>
在例一和例二中,aspx仅返回这个临时文件对应的URL, 浏览器获得这个URL后,将其以二维码方式在页面中展现,以便手机访问;<br>
在例三中,aspx用 Response.Redirect( )重定位函数,引导手机指向这个URL.<br>
所以,我们可以在aspx中设定Content-Type为纯文本就行,不需要返回HTML:<br>
<pre class='cpp'>
Response.ContentType = "text/plain";</pre>
<br>
<b>2.临时目录</b><br>
在示例中,报表服务将结果输出到Temp目录,和其自身的缓存目录处于同一个位置,试想一下,如果用的次数多了,垃圾文件就越来越多,服务器磁盘空间会被耗尽,为此我们专门增加了一个全局函数:CacheDirUtility,当您报表服务创建成功后,可以调用这个函数:<br>
<pre class='cpp'>
String ReportFilename = dll.func("CacheDirUtility", "isCreateTempFile=true;ext=htm;DeleteEarlierFile=15m;KeepMB=10");</pre>
这个函数的详细文档在 "Supcan Treelist组件\12.全局函数"中,参数中的 "DeleteEarlierFile=15m;KeepMB=10" 就是表示清理垃圾,它将删除15分钟前的文件、并保证缓存垃圾不超过10MB; "isCreateTempFile=true;ext=htm" 表示生成一个唯一的.htm文件,并返回全文件名.<br>
<img src='glass.jpg'><font color="552222">清理缓存需要消耗一定CPU,建议您产生一个随机数,随机清理,不需要每次都清理;</font><br>
<img src='glass.jpg'><font color="552222">KeepMB建议不要设得太大, 数字越大则缓存清理过程越慢;</font><br>
<br>
<b>3.示例3中分类汇总表查询的aspx源码分析</b><br>
<pre class='cpp'>
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);
}</pre>
<br><br><br><br><br>
<script type='text/javascript' src='nstd.js'></script>
</body></html>