1

我有一个 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 方法来传递参数,完全按照这个 SO answer中的描述。上面的 URL 现在看起来像:

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

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

我注意到,当列表较短并且报告显示成功时,浏览器会重定向到表单中的 URL:

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 有什么意义?

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

我对所涉及的大多数技术都非常缺乏经验,因此对于我未包含的任何相关细节,我深表歉意——请让我知道哪些信息可能会有所帮助。

4

2 回答 2

1

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

于 2012-09-07T02:04:09.677 回答
0

首先,无论是POST还是GET,通过uri传递参数,这叫做URI隧道,它有一个预定义的长度限制(如果我没记错的话我想大约2000个字符),因此你会看到是否没有区别或者不使用 POST 或 GET。又名.. http://url.com <-- 之后的任何内容是 Uri 隧道。

POST 请求通常伴随着 BODY 内容(可以是 XML、JSON 等),我认为这就是您从 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"); 创建一个输入元素来保存“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 的解构。

于 2012-09-08T11:07:44.197 回答