+
представляет пробел в строке запроса. Похоже, что отправляемая вами переменная query
неправильно закодирована в URL. К сожалению, вы не показали, как вы строите эту query
строковую переменную, но вот правильный путь для обеспечения того, чтобы все значения были правильно закодированы URL:
var values = HttpUtility.ParseQueryString(string.Empty);
values["foo"] = "some + value";
values["bar"] = "some other value";
string query = values.ToString();
// query will equal foo=some+%2b+value&bar=some+other+value
Обратите внимание, как знак +
, который изначально был частью значения, закодирован в %2B
.
Если вы напишите следующее:
string query = "foo=some + value&bar=some other value";
Я думаю, вы видите проблему для себя и разницу между правильной строкой запроса, которая foo=some+%2b+value&bar=some+other+value
.
Теперь, как говорится, вот что я бы предложил вам, чтобы улучшить ваш код. Вы можете расширить класс WebClient
, чтобы он мог обрабатывать файлы cookie, например:
public class WebClientEx : WebClient
{
public CookieContainer Cookies { get; private set; }
public WebClientEx()
{
Cookies = new CookieContainer();
}
protected override WebRequest GetWebRequest(Uri address)
{
var request = (HttpWebRequest)base.GetWebRequest(address);
request.CookieContainer = Cookies;
return request;
}
}
а теперь просто:
using (var client = new WebClientEx())
{
client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0";
client.Headers[HttpRequestHeader.AcceptLanguage] = "en-us,en;q=0.5";
var values = new NameValueCollection
{
{ "foo", "some value" },
{ "bar", "some & other + value =" },
};
byte[] buffer = client.UploadValues("http://www.example.com", values);
string result = Encoding.UTF8.GetString(buffer);
}
Посмотрите, насколько это проще, чем возиться со всеми этими запросами HttpWeb, ответами, потоками, кодировками и т. Д.?