gpt4 book ai didi

c# - WebRequest 在 ASP.NET 应用程序中失败并显示 "414 Request URI too long"

转载 作者:可可西里 更新时间:2023-11-01 09:05:22 24 4
gpt4 key购买 nike

我们有一个 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 等字节数(根据 this article),但应用程序仍然抛出错误。我已经在 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 的“地址”属性中。这可能是问题所在吗?如果是这样,如何解决。

最佳答案

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

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

关于c# - WebRequest 在 ASP.NET 应用程序中失败并显示 "414 Request URI too long",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13728034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com