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; LogLevel=2; BaseDir=http://localhost/supcan 可用属性及其解释说明如下: TempDir - 临时目录的全名, 非常重要。因为硕正报表服务在运行过程中会产生一些临时缓存文件，而Web服务器对目录的写权限有很严格的控制，为此您必须提供一个匿名访问者都能写的物理目录; BaseDir - 为后继的函数中可能出现的相对URL提供统一的参考路径。在浏览器端的开发中，"相对URL" 通常是相对于页面的，而在后端开发中，这个相对URL的参考点就必须指定，因为报表服务根本不知道当前aspx的实际URL; LogLevel - 日志级别， 为0/1/2, 默认是0, 0表示不需要日志，1表示需要简单的日志， 2需要更详细的日志. 日志文件会自动产生于临时目录 (即 TempDir 指向的物理目录) 中;
备注 | 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重启都困难. 切记!