我一直收到以下错误消息之一:
"The remote server returned an error: (400) Bad Request."
OR
"System.Net.ProtocolViolationException: You must write ContentLength bytes to the request stream before calling [Begin]GetResponse."
这是我正在运行的代码:
StringBuilder bld = new StringBuilder();
bld.Append("contractId=");
bld.Append(ctrId);
bld.Append("&companyIds=");
bld.Append("'" + company1+ ", " + company2+ "'");
HttpWebRequest req = (HttpWebRequest)WebRequest
.Create(secureServiceUrl + "SetContractCompanyLinks");
req.Credentials = service.Credentials;
//req.AllowWriteStreamBuffering = true;
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = bld.Length;
StreamWriter writer = new StreamWriter(req.GetRequestStream());
var encodedData = Encoding.ASCII.GetBytes(bld.ToString());
writer.Write(encodedData);
writer.Flush();
writer.Close();
var resp = req.GetResponse();
一些"关闭"的东西:
直接写信给您的作者调用GetBytes((应该没有任何理由。StreamWriter完全能够将字符串写入流:
writer.Write(bld.ToString());
在StreamWriter周围使用using(({}模式
这将确保正确处理写入程序对象。
using(var writer = new StreamWriter(req.GetRequestStream()))
{
writer.Write(bld.ToString());
}
您不需要显式设置内容长度别管它,框架会根据您对请求流所写的内容为您设置它。
如果需要明确使用ASCII,请在Content-Type标头中设置字符集
req.ContentType = "application/x-www-form-urlencoded; charset=ASCII";
您还应该在实例化StreamWriter时指定编码:
new StreamWriter(req.GetRequestStream(), Encoding.ASCII)
req.ContentLength = bld.Length;
StreamWriter writer = new StreamWriter(req.GetRequestStream());
var encodedData = Encoding.ASCII.GetBytes(bld.ToString());
writer.Write(encodedData);
你不是在写你说要写的东西——你写的是ASCII编码的字节,而不是你原来的字节数组——ContentLength
必须与你写的字节数相匹配。相反:
var encodedData = Encoding.ASCII.GetBytes(bld.ToString());
req.ContentLength = encodedData.Length;