Silverlight HttpWebRequest内容长度为空,WTF?

时间:2010-09-27 16:15:38

标签: c# silverlight httpwebrequest

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

如果我运行Fiddler,同时调试请求按预期执行并且服务器收到正文,我想我不会为请求配置任何想法吗?

        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 个答案:

答案 0 :(得分:0)

它是什么类型的服务器?如果客户端使用HTTP / 1.1协议(默认使用它),那么它不会使用请求发布整个实体主体。相反,它首先发送标题,使用Expect:100-continue标题...

  

POST / url HTTP / 1.1

     

主持人:主机名

     

内容长度:128

     

期待:100-continue

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

  

HTTP / 1.1 100继续

所以,可能是你发布的邮件服务器没有正确理解请求。这就是为什么当你通过Fiddler发布时,服务器最终获得实体,因为fiddler可能正在向服务器发送请求头和实体主体(在与客户端进行HTTP / 1.1 100继续握手之后)。

变通?

  1. 尝试在HttpWebRequest上设置Expect100Continue = false。
  2. 尝试使用HTTP / 1.0协议。

答案 1 :(得分:0)

要做的第一件事就是修复代码中的错误。该代码假定要发送的总字节数将是data字符串中的字符数。如果字符串包含基本ASCII字符集之外的字符,则不是这样。

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

答案 2 :(得分:0)

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