C# 包含XML的WebRequest帖子表单?

C# 包含XML的WebRequest帖子表单?,c#,xml,character-encoding,webrequest,C#,Xml,Character Encoding,Webrequest,我正在尝试使用.NETWebRequest发布表单。表单包含XML格式的字段。(除其他外)我尝试了以下代码: WebRequest req = WebRequest.Create(ctx.SvcUrl); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; using (var writer = new StreamWriter(req.GetRequestStream(), System.Tex

我正在尝试使用.NETWebRequest发布表单。表单包含XML格式的字段。(除其他外)我尝试了以下代码:

WebRequest req = WebRequest.Create(ctx.SvcUrl);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
using (var writer = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII))
{
    string reqBody = "first=<bill/>&last=smith"; //(embedded <>) - 500 Internal Server Error
    writer.Write(reqBody);
}
rsp = req.GetResponse();

var strm = rsp.GetResponseStream();
var rdr = new StreamReader(strm);
string input = rdr.ReadToEnd();
WebRequest req=WebRequest.Create(ctx.SvcUrl);
请求方法=“POST”;
req.ContentType=“应用程序/x-www-form-urlencoded”;
使用(var writer=newstreamwriter(req.GetRequestStream(),System.Text.Encoding.ASCII))
{
string reqBody=“first=&last=smith”;//(嵌入式)-500内部服务器错误
writer.Write(reqBody);
}
rsp=req.GetResponse();
var strm=rsp.GetResponseStream();
var rdr=新的StreamReader(strm);
字符串输入=rdr.ReadToEnd();
in reqBody导致500内部服务器错误


正确的编码方式是什么?或者多部分表单是答案吗???

您需要对请求进行编码。使用该类

使用System.Web.Util;
WebRequest req=WebRequest.Create(ctx.SvcUrl);
请求方法=“POST”;
req.ContentType=“应用程序/x-www-form-urlencoded”;
使用(var writer=newstreamwriter(req.GetRequestStream(),
系统.文本.编码.ASCII)
{
var编码器=新的HttpEncoder();
string reqBody=string.Format(“first={0}&last={1}”,
encoder.HtmlEncode(“”),
编码器.HtmlEncode(“史密斯”);
writer.Write(reqBody);
}
rsp=req.GetResponse();
var strm=rsp.GetResponseStream();
var rdr=新的StreamReader(strm);
字符串输入=rdr.ReadToEnd();
我使用了
String.Format()
,因为我觉得它看起来更漂亮,更清楚我在做什么,但这不是必需的。您也可以通过字符串连接来构建字符串,只要先通过
HttpEncoder.HtmlEncode()
传递即可。

尝试使用:

 string reqBody = string.Format("first={0}&last={1}", HttpUtility.HtmlEncode("<bill/>"), "smith");
string reqBody=string.Format(“first={0}&last={1}”,HttpUtility.HtmlEncode(“”,“smith”);

事实证明UrlEncoding是自动完成的,所以自己做可能会带来麻烦。此外,我连接的服务器无法处理任何编码。这使水变得浑浊,很难看出什么地方出了问题

最基本的解决方案是修复服务器以处理URL编码


正如“”所指出的,要避免自动操作,请使用TcpClient。但是编码应该存在。

尝试替换字符串中的“”字符。可能会成功吗?那不行。它将对
=
&
进行编码,这两个代码应保持未编码状态。如果您想使用它,您必须使用:
string reqBody=“first=“+HttpUtility.HtmlEncode”(“”+”)和last=“+HttpUtility.HtmlEncode(“smith”)
请注意,您在技术上不必对字符串进行编码,因为它不包含任何特殊字符。但我仍然认为将名称-值对中的所有值进行编码是一个好主意,以防以后值发生变化。HtmlEncoding似乎有两个问题,1)接收方必须解码——这是不透明的,2)当“first=&last=smith”得到HtmlEncoded时,我们有“first=bill&last=smith”,它现在有3个'&'字段分隔符--接收器无法正确解析它。请尝试使用
HttpUtility.UrlEncode()
。如果可以的话,我会更新我的答案。当我使用HtmlEncode或UrlEncode作为值时,我从接收者那里得到一个500内部服务器错误。当我发送纯文本时,它是URL编码的。(我将进一步检查).NET4.0API是否适合我。然而,HtmlEncode似乎不是解决方案。请参阅我对上述问题的评论。
 string reqBody = string.Format("first={0}&last={1}", HttpUtility.HtmlEncode("<bill/>"), "smith");