Ошибка WebRequest из-за слишком длинного URI запроса 414 в приложении ASP.NET

У нас есть приложение 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() добавляет параметры в свойство «адрес» веб-запроса. может в этом проблема? если да, то как это можно исправить.


person BIdude    schedule 05.12.2012    source источник


Ответы (7)


Можно ли использовать переменные POST вместо GET? Таким образом, нет никаких ограничений, о которых я знаю, поскольку все ваши данные будут отправляться в пакетах вместо заголовков HTTP.

На самом деле похоже, что вы можете использовать POST из того, что находится в вашем коде. Можете ли вы посмотреть в журналах сервера, чтобы проверить URI, который вызывает сбой? Если вы отправляете данные POST, uri запроса не должен быть проблемой, если только он не связан с данными, которые вы отправляете POST.

person Kasapo    schedule 05.12.2012
comment
Спасибо, Kasapo, я просмотрел журналы сервера и вижу, что сделанный запрос является POST-запросом. Однако я не вижу никаких упоминаний об ошибке 414, которую я получаю, что странно. Я просматриваю журнал IIS для экземпляра reportServer. - person BIdude; 11.12.2012

Проверьте настройки привязки вашего сервиса. Я предполагаю, что служба позволит использовать строку длиной до 8192. Установите te readerQuotas на больший размер. Может помочь.

...

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

.....

person Jay Sampat    schedule 25.12.2012

Поскольку вы уже используете POST для получения отчета, я бы предложил вместо этого поместить параметры, которые вы в настоящее время передаете в строке запроса, в тело запроса. Параметры строки запроса подходят для ограниченного числа параметров, но не подходят для большого количества элементов.

person 3Dave    schedule 05.12.2012
comment
Спасибо за идею, Дэвид, я попытался поместить параметры в тело запроса, и он работает правильно для меньшего набора параметров, но все еще не работает с той же ошибкой, когда выбрано большое количество параметров множественного выбора. - person BIdude; 11.12.2012
comment
Пожалуйста, найдите мой измененный код и изменения в исходном вопросе выше. ваше здоровье! - person BIdude; 11.12.2012

Можете ли вы показать значение webRequestURL?

Он будет «слишком большим».

Если вы передаете параметры этому URL-адресу, могут ли они быть в теле POST?

person Andrew    schedule 27.12.2012

webRequestURL.IndexOf("&") ... Это должно быть "?" вместо "&"? Я предполагаю, что вы создаете действительный URL-адрес для запроса страницы, а затем перепроектируете его, чтобы он был запросом POST, ища URL-адрес перед первым «&»...

Однако возможно, что GetResponse добавляет тело к URL-адресу, потому что он видит вопросительный знак в URL-адресе и предполагает, что параметры должны идти в URL-адресе? Попробуйте выполнить более точное сопоставление URL с нулевыми параметрами и без '?'.

person Richthofen    schedule 27.12.2012

Я получил это на работе на своем сайте IIS7. Исправлено с помощью взлома реестра, я могу найти его, но не будет работать до 3/1. Между тем, попробуйте, если вы получите сообщение об ошибке при использовании IP-адреса вместо обычного URL-адреса, если вы этого не сделаете, велика вероятность, что это та же проблема.

person peter    schedule 27.12.2012

Была аналогичная проблема, за исключением того, что POST работал, но второй POST с точно такими же параметрами возвращал 414.

Настройка req.KeepAlive = false; решил проблему, черт его знает почему.

person Timur Lyapin    schedule 28.11.2013