我一直收到以下错误消息之一:
"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."
Run Code Online (Sandbox Code Playgroud)
这是我正在运行的代码:
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();
Run Code Online (Sandbox Code Playgroud)
Dan*_*fer 12
一些"关闭"的东西:
直接 写给你的作家不应该有理由调用GetBytes().StreamWriter完全能够将字符串写入流:
writer.Write(bld.ToString());
Run Code Online (Sandbox Code Playgroud)
在StreamWriter周围使用using(){}模式
这将确保正确处理writer对象.
using(var writer = new StreamWriter(req.GetRequestStream()))
{
writer.Write(bld.ToString());
}
Run Code Online (Sandbox Code Playgroud)
您不需要显式设置内容长度 不管它,框架将根据您写入请求流的内容为您设置它.
如果您需要明确使用ASCII,请在Content-Type标头中设置charset
req.ContentType = "application/x-www-form-urlencoded; charset=ASCII";
Run Code Online (Sandbox Code Playgroud)
您还应该在实例化StreamWriter时指定编码:
new StreamWriter(req.GetRequestStream(), Encoding.ASCII)
Run Code Online (Sandbox Code Playgroud)