1

ユーザーが大きなリストから好きなだけ SSRS (サブ) レポートを選択できるようにする Silverlight アプリケーション (ブラウザーで実行するためのもの) があります。選択したサブレポートが 1 つの大きなレポートに集約され、このレポートが新しいウィンドウで起動されます。各サブレポートには、独自のパラメーター セットがあります。そのため、パラメーター値リストは非常に長くなる可能性があります。以前は、アプリケーションは 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 の長さの制限が原因であると考えたので、解決策を調べた後、この SO answerで説明されているとおりに、POST メソッドを使用してパラメーターを渡すようにしました。上記の 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 パラメータになります。多くのレポート パラメータがある場合に、URL の長さの制限を回避するために POST を使用するように多くの推奨事項を見てきましたが、これが理解できません。

それで、投稿されたパラメーターを伝播する方法はありますか? または、この問題を回避する別の方法はありますか?

私は関連する技術のほとんどに非常に不慣れなので、含まれていない関連する詳細については申し訳ありません。どのような情報が役立つか教えてください。

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文字列の最大長の制限はありません。Fiddlerやブラウザの開発者ツールなどのツールを使用してリクエストオブジェクトのメッセージ本文を検査するまで、本文のコンテンツにはURLhttp: //url.comと非表示のペイロードが含まれます。コメントアウトされた部分に注意してください

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

これにより、フォームのPOSTリクエストを介して渡すパラメータの値が設定されます。上記のコードでは、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 に答える