c#rd.Load(loadPath); 在本地工作,但不能在服务器上工作?

2020-09-06 19:54发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我希望有一个aspx页面,可以将其传递给简单的url参数,然后再加载.rpt文件。

这在运行Win10的本地开发机器上完美运行。 如果我像report1.aspx或report2.aspx这样运行报告,则报告运行良好

如果我以 website.com/report1.aspx?report=" report2.aspx ",它将忽略传递的参数,而是加载report1.aspx(与运行IIS的win10框中的行为完全不同)。 我已经在IIS8服务器和IIS 10服务器(Win 10也运行IIS 10)上都尝试过。

我不明白为什么Crystal在一台机器上接受传递的参数,而在另一台机器上不接受?

添加某种调试后,可以在本地看到,我可以正确获取参数,但是在服务器上,参数字符串永远不会被看到 aspx页面。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我希望有一个aspx页面,可以将其传递给简单的url参数,然后再加载.rpt文件。

这在运行Win10的本地开发机器上完美运行。 如果我像report1.aspx或report2.aspx这样运行报告,则报告运行良好

如果我以 website.com/report1.aspx?report=" report2.aspx ",它将忽略传递的参数,而是加载report1.aspx(与运行IIS的win10框中的行为完全不同)。 我已经在IIS8服务器和IIS 10服务器(Win 10也运行IIS 10)上都尝试过。

我不明白为什么Crystal在一台机器上接受传递的参数,而在另一台机器上不接受?

添加某种调试后,可以在本地看到,我可以正确获取参数,但是在服务器上,参数字符串永远不会被看到 aspx页面。

付费偷看设置
发送
3条回答
半个程序猿
1楼 · 2020-09-06 20:34.采纳回答

将您的CR代码移动到Page_Init,不会每次都调用Page_Load。

浮生未央
2楼-- · 2020-09-06 20:42

该报告在本地计算机上运行正常(两者均作为VS中的IIS Express和本地IIS [localhost/report.aspx]),它不执行的工作就是在服务器上的查询字符串中保留发送给它的参数(这似乎仅在使用CrystalReportViewer的页面上发生)。

服务器是一台崭新的服务器 已安装了2016年运行IIS 10的服务器。所有可再发行文件都就位,并且报表再次运行,它只是删除了我传递给页面的所有参数。

目标是能够在同一文件夹中拥有多个报告,并且只需通过传递带有文件名的参数即可调用它们。

使用系统;
 使用System.Collections;
 使用System.Web.UI;
 使用CrystalDecisions.Web;
 使用CrystalDecisions.CrystalReports.Engine;

 命名空间示例
 {
     公共局部类WebForm1:System.Web.UI.Page
     {
         受保护的void Page_Load(对象发送者,EventArgs e)
         {
             字符串调试= String.Empty;

             如果(!Page.IsPostBack)
             {
                
                 CrystalReportViewer crv = CrystalReportViewer1;
                 ReportDocument rd = new ReportDocument();
                 哈希表h = getURIParam(1);
                 字符串loadPath = String.Empty;
                                
                 如果(h!= null)
                 {
                     debug =" 
参数字符串为" + h [" report"]。ToString()。ToLower(); 如果(h [" report"]。ToString()。ToLower()。EndsWith("。rpt")) { loadPath = @" C:\ inetpub \ wwwroot \ crviewers \ rpt \" + h [" report"]。ToString(); } 其他 { loadPath = @" C:\ inetpub \ wwwroot \ crviewers \ rpt \" + h [" report"]。ToString()+" .rpt"; } } 其他 { debug ="
参数字符串为空"; loadPath = @" C:\ inetpub \ wwwroot \ viewers \ rpt \ example.rpt"; } 尝试 { debug =调试+"
loadpath =" + loadPath; rd.Load(loadPath); crv.ReportSource = rd; } 捕获(CrystalDecisions.Shared.CrystalReportsException ex) { Label1.Text ="找不到报告的路径:" + loadPath; Label1.Visible = true; } 抓住(前例外) { Label1.Text ="发生未处理的异常,请在服务台中打开故障单,其中包含以下错误

Trace:" + ex.ToString(); Label1.Visible = true; crv.Visible = false; } Label2.Text =调试; Label2.Visible = true; } 其他 { Label2.Text =调试+"
这是回发"; Label2.Visible = true; } } 私有Hashtable getURIParam(int v) { 尝试 { Hashtable h = new Hashtable(); 字符串参数= Request.QueryString [" report"]; 如果(!String.IsNullOrEmpty(param)) { h.Add(" report",param); 返回h; } 否则返回null; } catch(异常e) { 返回null; } } } }
bbpeas
3楼-- · 2020-09-06 20:39

通过"在本地运行",是否表示您正在通过Visual Studio中的浏览器运行? 如果是这样,那么在将应用程序部署到服务器时,需要注意以下几点:

1。 您的应用程序是32位还是64位? 如果是32位,则需要在IIS中创建一个32位应用程序池并在其中运行它。

2。 您是如何部署Crystal for VS SDK的? 如果只是在部署网站时复制了程序集文件,那将无法正常工作。 相反,您必须在服务器上安装SDK的运行时版本之一。 同样,如果您的应用程序是32位的,则无论服务器是32位还是64位,您都需要32位运行时。

-Dell

一周热门 更多>