10

レポートのパラメーターを WebRequest として渡した後、SSRS 2005 レポートを HTML 形式で要求する ASP.NET アプリケーションがあります。アプリケーションは、多数の複数選択パラメーターを含むレポートが要求された場合にのみ失敗し、行に「414: 要求 URI が長すぎます」というエラーがスローされますwebRequest.GetResponse()

リクエストを行うために使用されるコードは次のとおりです。

HttpWebRequest webRequest = null;
HttpWebResponse webResponse = null;
string webRequestURL = _ReportManager.GetRSUrl(reportID); //this passes the report link on the SSRS server

//make the request

Byte[] bytes = Encoding.UTF8.GetBytes("xml_doc=" + HttpUtility.UrlEncode(webRequestURL));

webRequest = (HttpWebRequest)WebRequest.Create(webRequestURL);
webRequest.Method = "POST";
webRequest.ContentLength = bytes.Length;
webRequest.Timeout = Configuration.WebRequestTimeOut;

RSExecution2005.ReportExecutionService rsE = new RSExecution2005.ReportExecutionService();
rsE.Url = Configuration.ReportExecutionServiceUrl2005;
rsE.Credentials = System.Net.CredentialCache.DefaultCredentials;
webRequest.Credentials = rsE.Credentials;

Stream reqStream = null;
reqStream = webRequest.GetRequestStream();
reqStream.Write(bytes, 0, bytes.Length);
reqStream.Close();

webResponse = (HttpWebResponse)webRequest.GetResponse();

サーバー側でレポートが失敗するため、IIS と ReportServer のプロパティを調べて、maxUrl、maxRequestLength、MaxQueryString などをバイト単位で増やしました (この記事に従って) が、アプリケーションはまだエラーをスローします。これをweb.configファイルとIISマネージャーで直接試しました。

レポート サーバーのバージョンは 2005 年で、IIS 7 を実行している Windows Server 2008 でホストされています。


David Lively のアドバイスで、本文にパラメーターを入れて URI を要求しようとしました。これは小さなリクエストでは機能しますが、大きな複数選択パラメータでは失敗します。修正後のコードは次のとおりです。

HttpWebRequest webRequest = null;
HttpWebResponse webResponse = null;
string webRequestURL = _ReportManager.GetRSUrl(reportID); //this passes the report link on the SSRS server

string postData = string.Empty;
string URIrequest = string.Empty;
URIrequest = webRequestURL.Substring(0, webRequestURL.IndexOf("&"));
int requestLen = webRequestURL.Length;
int postDataStart = webRequestURL.IndexOf("&") + 1;
postData = webRequestURL.Substring(postDataStart, (requestLen - postDataStart));

Byte[] bytes1 = Encoding.UTF8.GetBytes(postData);

webRequest = (HttpWebRequest)WebRequest.Create(URIrequest);
                webRequest.Method = "POST";
                webRequest.ContentType = "application/x-www-form-urlencoded";
                webRequest.ContentLength = bytes1.Length;
                webRequest.Timeout = Configuration.WebRequestTimeOut;

RSExecution2005.ReportExecutionService rsE = new RSExecution2005.ReportExecutionService();
rsE.Url = Configuration.ReportExecutionServiceUrl2005;
rsE.Credentials = System.Net.CredentialCache.DefaultCredentials;
webRequest.Credentials = rsE.Credentials;

Stream reqStream = webRequest.GetRequestStream();
reqStream.Write(bytes1, 0, bytes1.Length);
reqStream.Close();
webResponse = (HttpWebResponse)webRequest.GetResponse();

webRequest の requestURI にはパラメーターが格納されていませんが、GetReponse() 関数が webRequest の「address」プロパティにパラメーターを追加しているようです。これは問題でしょうか?もしそうなら、どうすれば修正できますか。

4

7 に答える 7

5

GET の代わりに POST 変数を使用することは可能ですか? そうすれば、すべてのデータが HTTP ヘッダーではなくパケットで送信されるため、私が認識している制限はありません。

実際には、コードの内容から POST を使用しているようです。サーバー ログを調べて、これが失敗する原因となっている URI を確認できますか? POST データを送信している場合、POST しているデータと無関係でない限り、リクエスト uri は問題になりません。

于 2012-12-05T20:28:30.813 に答える
3

サービスのバインディング設定を確認してください。このサービスでは、最大 8192 の長さの文字列が許可されると思います。readerQuotas をより大きなサイズに設定します。役立つかもしれません。

...

 <basicHttpBinding>
        <binding name="largeBuffer">
          <readerQuotas
                        maxDepth="2147483647"
                        maxStringContentLength="2147483647"
                        maxArrayLength="2147483647"
                        maxBytesPerRead="2147483647"
                        maxNameTableCharCount="2147483647" />
          <security mode="None"></security></binding>
  </basicHttpBinding>

.....

于 2012-12-25T19:56:10.530 に答える
2

既に POST を使用してレポートを取得しているため、代わりに、現在クエリ文字列で渡しているパラメーターをリクエスト本文に入れることをお勧めします。クエリ文字列パラメーターは、限られた数のパラメーターに対しては適切に機能しますが、多数の項目には適していません。

于 2012-12-05T20:25:32.547 に答える
1

webRequestURL.IndexOf("&") ... これは「?」という意味ですか? それ以外の "&"?ページをクエリするための有効な URL を作成し、最初の「&」の前の URL を探して、それをリバース エンジニアリングして POST 要求にしていると思います...

ただし、GetResponse は URL に疑問符が表示され、パラメーターが URL に含まれている必要があると想定しているため、URL に本文を追加している可能性があります。パラメーターがなく、「?」がない、より正確な URL 一致を試してください。

于 2012-12-27T22:10:15.020 に答える
1

IIS7 サイトでこれを取得しました。レジストリのハックで修正しました。検索はできますが、3/1 までは機能しません。一方、通常の URL の代わりに IP アドレスを使用してエラーが発生した場合は試してみてください。そうでない場合は、同じ問題である可能性が高くなります。

于 2012-12-27T22:22:38.877 に答える
1

webRequestURL の値を表示できますか?

「大きすぎる」ことになります。

この URL にパラメーターを渡す場合、代わりに POST 本文に入れることはできますか?

于 2012-12-27T03:25:59.507 に答える
0

POST が機能していたことを除いて、同様の問題がありましたが、まったく同じパラメーターを使用した 2 番目の POST は 414 を返しました。

設定 req.KeepAlive = false; 問題を解決しました。その理由は神のみぞ知るです。

于 2013-11-28T23:43:37.660 に答える