ASP.NET做报表,希望让用户在客户端浏览器能够把报表导出的PDF文件下载。但是,导出时遇到了“.rpt 内出错:拒绝访问报表文件。其他程序可能正在使用它”的问题,搜了一下,这个问题还算普遍,原因在于NTFS上要导出的报表目录的权限问题。
先说一下导出报表的代码。不管是书上还是网上给出的解决方案,一般都是类似于下面这样:
DiskFileDestinationOptions crDiskFileDestinationOptions = new DiskFileDestinationOptions();
crDiskFileDestinationOptions.DiskFileName = @" f:crystalreport1.pdf " ;
crExportOptions = oRpt.ExportOptions ;
crExportOptions.DestinationOptions = crDiskFileDestinationOptions;
crExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
crExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat ;
oRpt.Export();
oRpt.Close();
可是,其实用一行代码就能解决:
其中strPath为要导出文件的完整路径和文件名。
本质上来说,两种写法是一样的。可是我不明白的是,为什么本可以简单化的事情,非得写那么一大堆、搞好几个对象,倒来倒去的,看起来很晕。
接下来说导出时遇到的“拒绝访问报表文件。其他程序可能正在使用它”问题。
网上查到的解决方案,归结起来有几种:添加ASP.NET帐号的写权限、把ASP.NET添加到Administrators组、添加everyone写权限,有的甚至还提出需要把NETWORK SERVICE帐号的写权限加上。我按照这些方法反复实验,机器重启了N遍,但依然毫无进展。
吃午饭的时候,想着不行就干脆直接打印网页得了。吃完饭回去,想起之前没把工程目录放进wwwroot下的时候,曾经测试成功过,那时是直接给的绝对路径。自从把目录放进wwwroot下面后就不行了。心想把目录权限设成最开始的默认值再试试看吧。由于折腾半天目录的权限已经改得有点乱,索性把报表备份一下,把该目录删掉重新建立。新建目录的默认权限如图1所示。
图1
由于目录权限默认会继承wwwroot的权限设置,为了不让IIS的帐号权限影响它,故把权限的继承去掉,如图2。
图2
这样设置后,目录的权限就不受IIS的影响了,而是作为硬盘上一个普通的目录来看待了。再运行程序调试,居然通过了!导出、下载都毫无问题了~
这种方法根本没有ASP.NET帐号的事,也没有IIS相关帐号的事,更没有NETWORK SERVICE的事~简单易行