在中,解释了如何把Crystal Report整合到Sharepoint2010并把报表数据显示出来,但这样并不完整,因为我们在开发时是以系统帐户进行开发和部署的,而当部署后,就会出现因为访问权限问题造成的报错。在我的开发中遇到一个问题表现为(当以普通用户帐号登录时):
1、如果报表没有涉及传递任何参数:则报表能正常显示出来。 2、如果报表涉及到传参:则会出现 "Fail to render the page"错误。由此推断,错误是发生在报表参数的传递过程中的。 首先想到的解决办法是采用身份模拟(Impersonation)或通过SPSecurity.RunWithElevatedPrivileges来提高操作权限级别的方式来解决访问权限问题。但两者都失败了。分析原因是Crstalreportviewer在进行参数操作时仍然是通过的上下文用户权限进行操作,所以我们的身份模拟或RunWithElevatedPrivileges方式并没有作用到Crstalreportviewer这一过程。所以只有另想方法,问题就归结到"到底是什么资源拒绝了普通帐户的访问"。 使用Fiddler和Httpwatcher进行跟踪和测试都没把问题解决掉,最后使用了Process Monitor,对比系统帐户和普通帐户的访问差异,结果发现蛛丝马迹
于是修改Windows目录AppData(C:\Windows\ServiceProfiles\NetworkService\AppData)的权限,增加Everyone的读写(read,write)权限。问题终于得以解决。这说明Crstalreportviewer在获取参数后,要通过w3wp进程在C:\Windows\ServiceProfiles\NetworkService下创建临时文件,而2008下默认配置下网络普通用户对此目录没有权限,于是抛出上述错误。
当然,如果在报表中嵌入了图片,则需要修改存放图片的临时文件的文件夹的权限。我所作的修改是设置everone权限给
"C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp\cr_tmp_image___sd1-sp1dev_2010 "从而使嵌入的logo图片显示出来。
希望此文对大家有所启发。