繁体   English   中英

使用Webservice请求uri太久

[英]Request uri too long with webservice

我想通过需要这样的uri的网络服务进行创建:

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

我的问题是,元素是html正文的电子邮件的所有信息,大约6000个字符。
我想这样称呼网址:

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长度,并且Web服务需要URL中的参数。
我还没有找到适合我的解决方案,因此对您有所帮助。

更新:
对于面临相同问题的任何人,对我有用的解决方案是将查询放入类似的字节数组中

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

并将其写入webrequest而不是我的queryString

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

您可以将数据放在请求的主体中,如下所示:

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的,但是可以是您想要传递的任何内容...这是一个简单的示例,希望可以使您对如何进行操作有所了解。

您需要在问号处分割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();

祝您一切顺利。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM