使用POST传递报告参数,仍然达到长度限制

时间:2012-09-06 20:55:47

标签: c# silverlight post reporting-services

我有一个Silverlight应用程序(意味着在浏览器中运行),允许用户从大型列表中选择任意数量的SSRS(子)报告。选定的子报表将汇总到一个大型报表中,此报表将在新窗口中启动。 每个子报表都有自己的一组参数。因此,参数值列表可以变得非常长。以前,应用程序将使用GET方法传递参数值,例如:

http://<serverName>/_vti_bin/ReportServer/Pages/ReportViewer.aspx?http://<reportPath>&rs:Command=Render&rs:ClearSession=true&rc:Parameters=false&rc:Toolbar=true&rc:Zoom=100&FacilityUniqueValues=A&WorkWeek=0&...

但是使用长参数值列表,URL很容易超过2000个字符。在此长度或更长时间内,报告失败 - 浏览器只提供HTTP 404页面。我认为这是由于沿线某处的URL长度限制,因此,在查找解决方案之后,我使用POST方法传递参数,完全如this SO answer中所述。上面的URL现在看起来像:

http://<serverName>/_vti_bin/ReportServer/Pages/ReportViewer.aspx?<reportPath>

但是,当参数值列表很长时,问题仍然存在。

我注意到,当列表更短并且报告成功显示时,浏览器会重定向到以下格式的网址:

http://<serverName>/_layouts/ReportServer/RSViewerPage.aspx?rv:RelativeReportUrl=<relativeReportPath>&rv%3aParamMode=Hidden&rv%3aZoom=100&rp%3aFacilityUniqueValues=A&rp%3aWorkWeek=0&...

即。无论如何,这些值都被制成GET参数。我不明白这一点,因为当你有很多报告参数时,我已经看到很多建议使用POST来获取URL长度限制 - 如果重定向到GET URL有什么意义呢?

那么,有没有办法传播已发布的参数?或者另一种解决这个问题的方法?

我对大部分技术都很缺乏经验,所以我为没有包含的任何相关细节道歉 - 请告诉我哪些信息可能会有所帮助。

2 个答案:

答案 0 :(得分:1)

您要连接的报告服务器正在重定向到页面并将子报告指定为URL参数。这是报告服务器中的一个问题,而不是您可以在Silverlight应用程序中修复的问题。

答案 1 :(得分:0)

首先,不管它是POST还是GET,通过uri传递参数,它被称为URI隧道,它具有预定义的长度限制(如果我没记错的话,我认为大约2000个字符),因此你会看到无论你是否使用POST或GET都没有区别。 AKA .. http://url.com &lt; - 之后的任何内容都是Uri隧道。

POST请求通常伴随着BODY内容(可以是XML,JSON等等),这就是我认为您与navigate and post data from silverlight的链接的含义。正文内容/有效负载不具有URI字符串最大长度的限制。正文内容将具有URL http://url.com和不可见的有效负载,直到您使用Fiddler或浏览器的开发人员工具等工具检查请求对象的消息正文。注意注释掉的部分

// TODO: doc.CreateElement("input");
// TODO: SetAttribute("type", "hidden");
// TODO: SetAttribute("name", someName);
// TODO: SetAttribute("value", someValue);
// TODO: newForm.AppendChild()

这将设置要通过表单发布请求传递的参数的值。在上面的代码中,doc.CreateElement(“input”);创建一个input元素来保存隐藏值“someValue”和名称“someName”;

基于你的查询字符串我可以给你的一些例子

doc.CreateElement("input");
SetAttribute("type", "hidden");
SetAttribute("name", "FacilityUniqueValues");
SetAttribute("value", "A");
newForm.AppendChild()

doc.CreateElement("input");
SetAttribute("type", "hidden");
SetAttribute("name", "WorkWeek");
SetAttribute("value", 0);
newForm.AppendChild()

总而言之,您的服务器必须能够处理表单参数FacilityUniqueValues和WorkWeek的解构。