Web报表导出与“.rpt 内出错:拒绝访问报表文件。其他程序可能正在使用它”之我解

 ASP.NET做报表,希望让用户在客户端浏览器能够把报表导出的PDF文件下载。但是,导出时遇到了“.rpt 内出错:拒绝访问报表文件。其他程序可能正在使用它”的问题,搜了一下,这个问题还算普遍,原因在于NTFS上要导出的报表目录的权限问题。

先说一下导出报表的代码。不管是书上还是网上给出的解决方案,一般都是类似于下面这样:

ExportOptions   crExportOptions = new    ExportOptions();     
  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();  

可是,其实用一行代码就能解决:

rptDoc.ExportToDisk(ExportFormatType.PortableDocFormat, strPath)

其中strPath为要导出文件的完整路径和文件名。

本质上来说,两种写法是一样的。可是我不明白的是,为什么本可以简单化的事情,非得写那么一大堆、搞好几个对象,倒来倒去的,看起来很晕。

接下来说导出时遇到的“拒绝访问报表文件。其他程序可能正在使用它”问题。

网上查到的解决方案,归结起来有几种:添加ASP.NET帐号的写权限、把ASP.NET添加到Administrators组、添加everyone写权限,有的甚至还提出需要把NETWORK SERVICE帐号的写权限加上。我按照这些方法反复实验,机器重启了N遍,但依然毫无进展。

吃午饭的时候,想着不行就干脆直接打印网页得了。吃完饭回去,想起之前没把工程目录放进wwwroot下的时候,曾经测试成功过,那时是直接给的绝对路径。自从把目录放进wwwroot下面后就不行了。心想把目录权限设成最开始的默认值再试试看吧。由于折腾半天目录的权限已经改得有点乱,索性把报表备份一下,把该目录删掉重新建立。新建目录的默认权限如图1所示。


图1

由于目录权限默认会继承wwwroot的权限设置,为了不让IIS的帐号权限影响它,故把权限的继承去掉,如图2。


图2

这样设置后,目录的权限就不受IIS的影响了,而是作为硬盘上一个普通的目录来看待了。再运行程序调试,居然通过了!导出、下载都毫无问题了~

这种方法根本没有ASP.NET帐号的事,也没有IIS相关帐号的事,更没有NETWORK SERVICE的事~简单易行

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值