10

我们有一个 ASP.NET 应用程序,它在将报表参数作为 WebRequest 传递后请求 HTML 格式的 SSRS 2005 报表。仅当请求具有大量多选参数的报告时,应用程序才会失败,并在该webRequest.GetResponse()行抛出“414:请求 URI 太长”错误。

用于发出请求的代码是:

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

您可以使用 POST 变量而不是 GET 吗?这样,我知道没有任何限制,因为您的所有数据都将以数据包而不是 HTTP 标头的形式发送。

实际上,看起来您可能正在使用代码中的 POST。您可以查看服务器日志以验证导致此失败的 URI 吗?如果您要发送 POST 数据,则请求 uri 应该不是问题,除非它与您要发布的数据无关。

于 2012-12-05T20:28:30.813 回答
3

检查您的服务的绑定设置。我猜该服务将允许字符串长度达到 8192。将 te 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

我在我的 IIS7 网站上得到了这个。用注册表黑客修复了它,我可以搜索它,但在 3/1 之前无法使用。同时,尝试使用 ip-address 而不是正常 URL 时出现错误,如果没有,则很有可能是同样的问题。

于 2012-12-27T22:22:38.877 回答
1

webRequestURL.IndexOf("&") ...这是否意味着“?” 代替 ”&”?我猜你构造了一个有效的 URL 来查询页面,然后通过在第一个 '&' 之前查找 URL 将其反向工程为一个 POST 请求......

但是,GetResponse 可能会将正文附加到 URL,因为它在 URL 中看到问号并假定参数必须进入 URL?尝试使用零参数且没有“?”进行更精确的 URL 匹配。

于 2012-12-27T22:10:15.020 回答
1

你能显示 webRequestURL 的值吗?

它会“太大”。

如果您将参数传递给此 URL,它们可以在 POST 正文中吗?

于 2012-12-27T03:25:59.507 回答
0

有一个类似的问题,除了 POST 工作正常,但具有完全相同参数的第二个 POST 返回 414。

设置 req.KeepAlive = false; 解决了这个问题,天知道为什么。

于 2013-11-28T23:43:37.660 回答