3.API
| 函数 | int GetActiveServices( ) |
|---|---|
| 用途 | 取得当前进程中活动的服务数量, 即并发执行中的线程数 |
| 返回值 | 整数, 大于等于零 |
..
if(dll.GetActiveServices( ) > 5) {
Response.Write("服务器忙,请稍后再试");
Response.End();
return;
}
或者让线程等待:
..
while(dll.GetActiveServices( ) > 5) {
Thread.Sleep(100);
};
上面例子中的上限是 5, 考虑到每个服务的活动时间都很短, 通常也就几十到几百毫秒, 并发数量达到 5 时已经是相当繁忙了。

在 1.0.109.0 以前的版本中, 我们要求当前只要有活动服务数, 就返回或者执行 Sleep 等待, 因为内核是单线程运行.
| 函数 | bool OpenReportService(string CreatePara) |
|---|---|
| 用途 | 打开报表服务 |
| 参数 | ";"分隔的 名-值对 串, 例如: TempDir=c:\\website\\temp; LogSize=1000; LogLevel=2; BaseDir=http://localhost/supcan 可用属性及其解释说明如下: TempDir - 临时目录的全名, 非常重要。因为硕正报表服务在运行过程中会产生一些临时缓存文件,而Web服务器对目录的写权限有很严格的控制,为此您必须提供一个匿名访问者都能写的物理目录; BaseDir - 为后继的函数中可能出现的相对URL提供统一的参考路径。在浏览器端的开发中,"相对URL" 通常是相对于页面的,而在后端开发中,这个相对URL的参考点就必须指定,因为报表服务根本不知道当前aspx的实际URL; LogLevel - 日志级别, 为0/1/2, 默认是0, 0表示不需要日志,1表示需要简单的日志, 2需要更详细的日志. 日志文件名为 @Log.txt, 会自动产生于临时目录 (即 TempDir 指向的物理目录) 中; LogSize - 日志文件最大尺寸, 单位为kb. 防止日志文件无限膨胀. |
| 备注 | 1.TempDir 必须要设定,否则本函数调用会失败; 2.TempDir 指向的物理目录必须给予最高的访问权限,例如 everyone 的读写权 |
| 返回值 | true/false, 失败的原因通常为DLL文件位置不正确、或 TempDir 未指定 |
| 函数 | string func(string funcname, string para) |
|---|---|
| 用途 | 调用报表服务 |
| 参数 | 和硕正套件常规的用法完全一致,请参考硕正常规的开发文档 |
| 返回值 | 串, 也和套件的常规的用法一致 |
| 函数 | void CloseService( ) |
|---|---|
| 用途 | 关闭报表服务 |
| 返回值 | 无 |
~DllInvoke() {
CloseService( );
if(m_hLib != IntPtr.Zero) FreeLibrary(m_hLib);
}
但我们发现,这个 CloseService( )不一定会被执行到,可能和非托管有关,最终结果就是应用程序池资源耗尽,导致http请求响应异常,产生大量 httpStatusCode 为 503 的错误,甚至IIS重启都困难. 切记!