c#httpclient POST请求:无法发送特殊字符

c#httpclient POST请求:无法发送特殊字符,c#,encoding,httpclient,urlencode,C#,Encoding,Httpclient,Urlencode,我有一个程序应该登录到站点,它使用POST请求,一切正常,直到其中一个值包含特殊字符(例如“%”) 当然,我也用谷歌搜索了一下,查了所有我能找到的。我想我需要“警告”服务器abaut编码,所以我添加了 request.Headers.TryAddWithoutValidation("Content-Type", @"application/x-www-form-urlencoded; charset=UTF-8"); 但这对我仍然没有帮助 内容类型和请求的方式应该和我从Firebug得到的一样

我有一个程序应该登录到站点,它使用POST请求,一切正常,直到其中一个值包含特殊字符(例如“%”)

当然,我也用谷歌搜索了一下,查了所有我能找到的。我想我需要“警告”服务器abaut编码,所以我添加了

request.Headers.TryAddWithoutValidation("Content-Type", @"application/x-www-form-urlencoded; charset=UTF-8");
但这对我仍然没有帮助

内容类型和请求的方式应该和我从Firebug得到的一样,所以如果我能在那个里找到一些答案,请指出

修改0:此外,我将程序发送到服务器的内容与浏览器请求(使用Firebug)进行了比较,我的请求完全相同。唯一的区别-我的请求在包含特殊字符的值中不被接受

修改1:另外,当我在浏览器中检查服务器时,服务器在处理特殊字符方面没有问题。例如,它(浏览器)将“K&YF82”发送为“captcha_text=K%26YF82”(地址属性和请求正文中的值相同),并且所有操作都正常。UrlEncode做同样的替换,但在我的程序中,它并没有被服务器接受

解决方案:

{ password:"df464dsj", username:"username", captchaText:"ABC&%", remember_login:"false" }
代替

password=f2341f14f&username=username&captha...

您正在处理REST应用程序吗

如果是,则在请求正文中发送post数据,而不是查询字符串


还可以查看堆栈帖子:

服务器不识别验证码并返回失败?您在服务器上接收到什么?你调试过吗?你在服务器上正确地解码了值吗?你到底犯了什么错误?{“成功”:错误,“消息”:“错误验证人性”,“需要验证码”:正确}这就是当验证码包含特殊字符时我得到的结果。当它的非验证码被接受并且没有错误时。{“success”:false,“captcha_needed”:true,“message”:“error login”}这里只用字母和数字回答验证码。它仍然失败,因为密码也包含特殊字符。这就是为什么我认为spec chars中存在这个问题。我之前找到了这个链接,并尝试用它来形成字符串:StringContent request=newstringcontent(requestData,Encoding.UTF8,“application/x-www-form-urlencoded”);没有帮助。我还检查了请求体和查询字符串,它们都有相同的参数,顺序不同,所以我在代码中也是这样做的。我认为问题在于符号,而不是参数位置。服务器接受验证码,只要它不包含特殊字符。所以,这是万恶之源。这个链接可以帮助你或编写你自己的模板来处理这些特殊字符,并在执行HTTP POST时进行替换,服务器会将它们作为特殊字符进行致畸,这让我觉得我发布的信息太少了,但如果我发布我发现和检查的所有信息,这将需要5页,没有人会阅读它。服务器不阻塞%,它在浏览器中的验证码中工作得很好。问题从我的程序开始。(将在几分钟内更新主帖子)您能发布您在fiddler中看到的实际查询字符串或请求正文吗?你看到下面这样的内容了吗?password=somepassword&usename=someuser&captcha_text=ABCDCaptcha“Y@&NQL”,由浏览器发送的查询字符串“password=fvQnb%2B6C1gxtqNQ%3D%3D&username=mylogin&captcha_text=Y%40%26NQL&membere_login=false”验证码在正文和查询字符串中编码相同。
password=f2341f14f&username=username&captha...