代码之家  ›  专栏  ›  技术社区  ›  AwkwardCoder

Silverlight HttpWebRequest内容长度为空,WTF?

  •  1
  • AwkwardCoder  · 技术社区  · 14 年前

    当我运行以下代码时,接收请求的RESTful web服务有一个空的主体(内容长度=0),我不知道为什么?

            var request = (HttpWebRequest)WebRequest.Create(uri);
            request.ContentType = "text/xml";
            request.Method = "POST";
            request.CookieContainer = new CookieContainer();
            request.CookieContainer.Add(uri, new Cookie("SSOToken", HttpUtility.UrlEncode(SsoToken)));
            request.ContentLength = data.Length;
    
            request.BeginGetRequestStream(ar1 =>
            {
                var byteArray = Encoding.UTF8.GetBytes(data);
    
                var stream = request.EndGetRequestStream(ar1);
                stream.Write(byteArray, 0, data.Length);
                stream.Close();
    
                request.BeginGetResponse(ar2 => HandleSearchCompleted(ar2, request, action), state);
            }, state);
    
    3 回复  |  直到 14 年前
        1
  •  0
  •   AnthonyWJones    14 年前

    首先要做的是修复代码中的错误。代码假定要发送的字节总数是 data

    您应该首先获取UTF8字节数组,并使用该数组的长度作为ContentLength,并确保发送整个数组。

        2
  •  0
  •   slipjig    14 年前

    您可以尝试将内容类型设置为“application/x-www-form-urlencoded”,而不是“text/xml”,URL编码xml内容,并将其分配给请求正文中的变量。在尝试使用服务器端的Request.Form访问数据时,我遇到了相同的行为,直到我正确设置了内容类型。如果您正在服务器上使用其他方法获取原始数据,则这可能不适用。

        3
  •  0
  •   Bill the Lizard    12 年前

    它是哪种服务器?如果客户机使用的是HTTP/1.1协议(这是它默认使用的协议),那么它不会将整个实体体与请求一起发布。相反,它首先只是发送头文件,带有一个Expect:100 continue头文件。。。

    POST/url HTTP/1.1

    主机:主机名

    预期:100继续

    此时,如果服务器已准备好接受数据,则它应答复:

    HTTP/1.1 100继续

    因此,可能是您正在向错误的服务器发送消息,该服务器无法正确理解请求。这就是为什么,当您通过Fiddler发送消息时,服务器最终获得实体,因为Fiddler可能正在向服务器发送请求头和实体体(在执行HTTP/1.1100之后,继续与客户端握手)。

    解决办法?

    1. 尝试使用HTTP/1.0协议。