【问题标题】:Request uri too long with webservice使用 web 服务请求 uri 太长
【发布时间】:2014-10-06 15:47:29
【问题描述】:

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

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

【问题讨论】:

  • 您使用的是POST,为什么不在请求正文中传递信息?
  • 您似乎对 GET 和 POST 如何工作以及在代码中混合使用两者感到困惑。如果您通过 POST 发送数据,则不需要将它们作为查询参数包含在内。
  • 如果我将信息添加到正文中,如何将它们放在 url 之后,以便 web 服务执行应有的操作?

标签: c# web-services webrequest


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    祝你任务顺利。

    【讨论】:

      猜你喜欢
      • 2018-01-25
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 2022-06-15
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多