2010-05-28 4 views
1

У меня был проект, который потребовал отправить QueryString на 2,5 миллиона символов на веб-страницу. Сам сервер обрабатывал только URI, который составлял 5400 символов или меньше. После попытки несколько различных наборов коды для WebRequest/WebResponse, WebClient и сокетов, я наконец-то нашел следующий код, который решить мою проблему:Как избежать ошибки сервера 414 для очень длинных значений QueryString

HttpWebRequest webReq; 
HttpWebResponse webResp = null; 
string Response = ""; 
Stream reqStream = null; 
webReq = (HttpWebRequest)WebRequest.Create(strURL); 

Byte[] bytes = Encoding.UTF8.GetBytes("xml_doc=" + HttpUtility.UrlEncode(strQueryString)); 
webReq.ContentType = "application/x-www-form-urlencoded"; 
webReq.Method = "POST"; 
webReq.ContentLength = bytes.Length; 
reqStream = webReq.GetRequestStream(); 
reqStream.Write(bytes, 0, bytes.Length); 
reqStream.Close(); 
webResp = (HttpWebResponse)webReq.GetResponse(); 

if (webResp.StatusCode == HttpStatusCode.OK) 
{ 
    StreamReader loResponseStream = new StreamReader(webResp.GetResponseStream(), Encoding.UTF8); 
    Response = loResponseStream.ReadToEnd(); 
} 

webResp.Close(); 
reqStream = null; 
webResp = null; 
webReq = null; 
+0

Вы вводите в заблуждение протокол TCP и HTTP, который является протоколом более высокого уровня. Без дополнительной информации невозможно узнать, что ожидает сервер. Он может ожидать подключения к сокету TCP и записи текстовых данных непосредственно в сокет или может ожидать HTTP POST. Кроме того, ваш примерный URL-адрес является HTTPS, для которого требуется шифрованный SSL-сокет ... – Peter

+0

Вы правы, что он ожидает HTTP POST. Я буду зашифровать SSL-сокеты SSL и HTTP POST. –

ответ

1

Вам не нужно использовать гнезда вручную. Вы можете использовать объект HttpWebRequest для обработки уровня сокета. Вы можете увидеть ответы на this other question для примера кода, который будет размещать файл. Просто измените целевой URL на HTTPS-url для использования SSL.

+0

Сначала я начал с этого подхода, но с сервера я получил ошибку 414 (слишком длинный URL). Я попытался использовать UploadString и DownloadString с WebClient, но это также вернуло 414. Учитывая ваш комментарий, я искал дополнительные примеры WebRequest, и я нашел тот, который работал. Я отправлю код, который я выполнил в исходном вопросе. –