2014-10-06 121 views
0

我想做的事情通过它需要这样一个URI webservice的一个创造:
请求URI过长与web服务

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(); 

并表示URI太长。

我无法更改服务器的最大URL长度,并且webservice需要url中的参数。
我还没有找到合适的解决方案,所以任何帮助表示赞赏。

更新:
对于任何人面临同样的问题,这对我工作的解决办法是把我查询到一个字节数组一样

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

,并编写成WebRequest的,而不是我的查询字符串

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

您正在使用'POST',那么您为什么不通过请求正文中的信息? – Belogix 2014-10-06 15:51:55

+0

您似乎对GET和POST的工作方式以及在代码中混合使用这两种方式感到困惑。如果您通过POST发送数据,则不需要将它们作为查询参数。 – 2014-10-06 15:54:04

+0

如果我将这些信息添加到body中,我怎么能把它们放在url之后,这样webservice才会做它应该做的事情? – user2414460 2014-10-07 10:18:04

回答

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(); 

祝你好运与你的追求。