3.API


  winface.dll 暴露了 4 个 API 函数, 如下是其详细说明.
函数int GetActiveServices( )
用途取得当前进程中活动的服务数量, 即并发执行中的线程数
返回值整数, 大于等于零
  dll 创建成功后,建议您先调用这个函数,检查一下当前的活动服务数量,当数量多于某个上限, 比如 5, 建议您给出适当的处理, 以防止 DDOS 潮水攻击, 例如:
..
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重启都困难. 切记!