У нас есть приложение ASP.NET, которое запрашивает отчет SSRS 2005 в формате HTML после передачи параметров отчета в виде WebRequest. Приложение дает сбой только тогда, когда запрашивается отчет с большим количеством параметров множественного выбора, выдавая ошибку «414: Request URI too long» в строке 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 года, и он размещен на Windows Server 2008, на котором работает IIS 7.
По совету Дэвида Лайвли я попытался запросить 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();
Несмотря на то, что requestURI веб-запроса не хранит параметры, кажется, что функция GetReponse() добавляет параметры в свойство «адрес» веб-запроса. может в этом проблема? если да, то как это можно исправить.