当我运行以下代码时,接收请求的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);
答案 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 :(得分:0)
要做的第一件事就是修复代码中的错误。该代码假定要发送的总字节数将是data
字符串中的字符数。如果字符串包含基本ASCII字符集之外的字符,则不是这样。
首先应该获取UTF8字节数组,并将此数组的长度用作ContentLength,并确保发送整个数组。
答案 2 :(得分:0)
您可以尝试将内容类型设置为“application / x-www-form-urlencoded”而不是“text / xml”,对xml内容进行URL编码,并将其分配给请求正文中的变量。尝试在服务器端使用Request.Form访问数据时,我遇到了同样的行为,直到我正确设置了内容类型。如果您在服务器上使用其他方法来获取原始数据,那么这可能不适用。