【问题标题】:Passing report parameters with POST, still hitting length limit使用 POST 传递报告参数,仍然达到长度限制
【发布时间】:2012-09-06 20:55:46
【问题描述】:

我有一个 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>

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

我注意到,当列表较短且报告显示成功时,浏览器会重定向到表单中的 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 参数?或者其他解决这个问题的方法?

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

【问题讨论】:

    标签: c# silverlight post reporting-services


    【解决方案1】:

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

    【讨论】:

    • 好的,谢谢。我确实有权访问报告服务器,因此我愿意考虑为此提供解决方案。
    【解决方案2】:

    首先,不管是POST还是GET,通过uri传递参数,这叫做URI隧道,它有一个预定义的长度限制(如果我没记错的话我想大约2000个字符),因此你会看到无论您使用 POST 还是 GET,都没有区别。又名..http://url.com? ? 之后的任何内容都是 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");创建一个输入元素来保存“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 的解构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多