2014-10-06 3 views
0

Я хочу сделать создать с помощью веб-сервиса, который нуждается в URI, как это:
Запрос URI слишком долго с WebService

http://<url>/webservice.php?operation=<operation>&elementType=<elementType>&element=<element>& 

моя проблема, элемент является вся информация по электронной почте с HTML тела, которое является около 6000 символов.
Я хочу, чтобы вызвать URL, как это:

var request = WebRequest.Create(urlToUse.ToString()); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = urlToUse.Length; 

var requestStream = request.GetRequestStream(); 
var requestStreamWriter = new StreamWriter(requestStream); 
requestStreamWriter.Write(urlToUse); 
requestStreamWriter.Close(); 

var response = request.GetResponse(); 
var responseStream = response.GetResponseStream(); 
if (responseStream == null) return null; 
var responseStreamReader = new StreamReader(responseStream); 

var responseFromServer = responseStreamReader.ReadToEnd(); 

responseStreamReader.Close(); 
responseStream.Close(); 
response.Close(); 

но он ломает в

var response = request.GetResponse(); 

и говорит Ури слишком долго.

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

Update:
Для тех, кто сталкивается с аналогичной проблемой, решение, которое работало для меня было поместить мой запрос в байт-массив как

var encoding = new UTF8Encoding(); 
byte[] bytes = enconding.GetBytes((queryString)); 

и писал, что в WebRequest вместо моего QueryString

var stream = request.GetRequestStream(); 
stream.Write(bytes, 0, bytes.Length); 
+2

Вы используете 'POST', так почему бы вам не передать информацию в теле запроса? – Belogix

+0

Вы, кажется, путаетесь с тем, как GET и POST работают и используют сочетание обоих в вашем коде. Если вы отправляете данные через POST, вам не нужно включать их в качестве параметров запроса. –

+0

Если я добавлю информацию в тело, как я могу поместить их после URL-адреса, чтобы веб-сервис выполнял то, что нужно? – user2414460

ответ

1

Вы можете поместить данные в теле запроса с чем-то немного, как это:

using (var client = new HttpClient()) 
{ 
    client.BaseAddress = new Uri("http://<url>/webservice.php"); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    var jsonContent = JsonConvert.SerializeObject(new YourObject 
    { 
     // Pseudo code... Replace <...> with your values etc 
     Operation = <YourOperation>, 
     ElementType = <YourElementType>, 
     Element = <YourElement>, 
     // etc... 
    }); 

    HttpResponseMessage response; 
    using (HttpContent httpContent = new StringContent(jsonContent, Encoding.UTF8, "application/json")) 
    { 
     response = await client.PostAsync("youroperation/", httpContent); 
    } 

    // Do something with response if you want 
} 

Это JSON, но может быть все, что вы хотите передать ... Это простой пример, который, надеюсь, даст вам представление о том, как вы можете продолжить.

1

Вы должны разделить urlToUse на знак вопроса:

Что-то вроде этого (не проверено)

string[] parts = urlToUse.ToString().Split(new char[]{'?'}, 2); 
string url = parts[0]; 
string data = parts[1]; 
var request = WebRequest.Create(url); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = data.Length; 

var requestStream = request.GetRequestStream(); 
var requestStreamWriter = new StreamWriter(requestStream); 
requestStreamWriter.Write(data); 
requestStreamWriter.Close(); 

var response = request.GetResponse(); 
var responseStream = response.GetResponseStream(); 
if (responseStream == null) return null; 
var responseStreamReader = new StreamReader(responseStream); 

var responseFromServer = responseStreamReader.ReadToEnd(); 

responseStreamReader.Close(); 
responseStream.Close(); 
response.Close(); 

удачи с поисками.