WebRequest терпит неудачу с "414 Request URI too long" в приложении ASP.NET
У нас есть приложение ASP.NET, которое запрашивает отчет SSRS 2005 в формате HTML после передачи параметров отчета в виде WebRequest. Приложение завершается с ошибкой, когда запрашивается отчет с большим количеством параметров множественного выбора, вызывая слишком длинную ошибку "414: Request 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 году и размещена на Windows Server 2008, где работает IIS 7.
В интервью 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();
Несмотря на то, что requestURI в webRequest не сохраняет параметры, кажется, что функция GetReponse() добавляет параметры в свойство 'address' для webRequest. может ли это быть проблемой? если да, то как это можно исправить.
Ответы
Ответ 1
Возможно ли использовать переменные POST вместо GET? Таким образом, я не знаю никаких ограничений, поскольку все ваши данные будут отправляться в пакетах вместо заголовков HTTP.
На самом деле похоже, что вы можете использовать POST из кода. Можете ли вы посмотреть в журналах сервера, чтобы проверить URI, который вызывает это? Если вы отправляете данные POST, запрос uri не должен быть проблемой, если он не связан с данными, которые вы используете POST.
Ответ 2
Проверьте настройки привязки вашего сервиса. Я предполагаю, что эта услуга позволит увеличить длину строки до 8192. Установите te readerQuotas в большем размере. Может помочь.
...
<basicHttpBinding>
<binding name="largeBuffer">
<readerQuotas
maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
<security mode="None"></security></binding>
</basicHttpBinding>
.....
Ответ 3
Поскольку вы уже используете POST для получения отчета, я бы предложил вместо этого добавить те параметры, которые вы сейчас передаете в строке запроса в теле запроса. Параметры Querystring работают нормально для ограниченного числа параметров, но не подходят для большого количества элементов.
Ответ 4
Можете ли вы показать значение webRequestURL?
Это будет "слишком большой".
Если вы передаете параметры этому URL-адресу, могут ли они быть в элементе POST?
Ответ 5
webRequestURL.IndexOf( "&" )... Это значит быть?? вместо "&" ? Я предполагаю, что вы создаете действительный URL-адрес для запроса страницы, а затем реконструируете его как запрос POST, ища URL-адрес перед первым "&" ...
Однако возможно ли, что GetResponse добавляет тело к URL-адресу, поскольку видит URL-адрес в URL-адресе и предполагает, что параметры должны указывать в URL-адресе? Попробуйте выполнить более точное сопоставление URL с нулевыми параметрами и не "?".
Ответ 6
Я получил это на моем сайте IIS7. Если он исправлен с помощью реестра, я могу найти его, но не будет работать до 3/1. Между тем, попробуйте, если вы получите ошибку, когда используете ip-адрес вместо обычного URL-адреса, когда вы этого не сделаете, шансы высоки, это та же проблема.
Ответ 7
Имел аналогичную проблему, за исключением того, что POST работал, но второй POST с точно такими же параметрами возвращался 414.
Установка req.KeepAlive = false; решил проблему, Бог знает почему.