集成ReportServices到自定义程序
这个也是最近做项目中碰到的比较头痛的问题之一,Report Services是一个非常好的BI前端展现工具,展现内容丰富,开发速度快。可是问题是我们自己做了一个智能客户端来实现BI的前端展现,要是能够把ReportService集成到我们自己的winform程序里面来,那不是很爽。
于是我就开始研究帮助文档,里面有篇《URLAccess》,地址是
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/rptsprg9/html/52c3f2a3-3d6d-4fee-9c46-83f366919398.htm
看了一遍以后,感觉思想很简单,就是把ReportServices配置成URL访问的形式,那么不论我们的客户端程序还是浏览器等都可以很方便的访问。接下来很快就碰到问题了,经过试验,发现本机没有任何问题,但是报表部署在服务器上就有问题了,如果配置成匿名访问吧,数据不安全;如果配置成集成windows验证吧,集成到我们自己的应用程序的时候,就有问题了;这个问题我想了很多办法解决。包括用了这片文章里面的解决方法(ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/rptsprg9/html/d2327e7c-0d48-49e3-bcd9-3bba4e67a68b.htm),自定义身份验证。自定义身份验证这个方法虽然可以满足我集成到应用程序的要求,但是我发布报表的时候太麻烦了,还要转换回windows集成验证的方式,我才能发布,不是一般的麻烦。
过了一段时间以后,我想到一个方法,也就是我现在采用的方法,完全可行哦。首先我开发一个web项目,里面只有一个页面Default.aspx,在这个页面里面放一个ReportView控件,设置控件的如下属性
ReportViewer1.ProcessingMode = ProcessingMode.Remote;
ReportViewer1.ServerReport.ReportServerUrl = new Uri(ReportServerURL);
ReportViewer1.ServerReport.ReportPath = ReportPath;
部署到服务器的默认网站的一个虚拟目录下面;
接下来这步非常关键,请注意
IIS默认的应用程序池用户对报表访问是没有权限的(因为现在ReportServices现在还是window集成验证)
a.新建用户reportuser,隶属于IIS_WPG(应用程序池用户必须隶属于这个的)
b.新建应用程序池ReportSite,指定标识用户为reportuser
c.在ReportSite所在的物理路径的文件夹加上reportuser的访问权限
d.把ReportSite虚拟目录的应用程序池换成刚刚创建的ReportSite
e.重启IIS,在命令行下面执行iisreset
好了,这样的配置下来,如果不出意外的话,我们应该可以在客户端用浏览器访问服务器上这个虚拟目录下面的Default.aspx了,那么我么可以在页面名称后面加"?ReportPath=/ReportPath/ReportName",这样就可以访问到我们的ReportServices报表了,注意处理Request这个代码我已经写到Default.aspx里面去了。
现在再要把这个网页集成到我的智能客户端里面去就简单了。现在轮到webBrowser出马,设置如下属性
//防止 WebBrowser 控件打开拖放到其上的文件。
webBrowser1.AllowWebBrowserDrop = false;
//以防止 WebBrowser 控件在用户右击它时显示其快捷菜单。
webBrowser1.IsWebBrowserContextMenuEnabled = false;
//防止 WebBrowser 控件响应快捷键。
webBrowser1.WebBrowserShortcutsEnabled = true;
//防止 WebBrowser 控件显示脚本代码问题的错误信息。
// Uncomment the following line when you are finished debugging.
webBrowser1.ScriptErrorsSuppressed = false;
好了,打完收工,一切结束。