HttpRequest和POST

Att*_*lah 3 .net c# wcf

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

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