HttpRequest and POST

本文关键字:POST and HttpRequest | 更新日期: 2023-09-27 18:06:03

我一直收到以下错误消息之一:

"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();

HttpRequest and POST

一些"关闭"的东西:

直接写信给您的作者调用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;