Я подтвердил, что поведение .NET 3.5 отличается от .NET 4.0. Для тестирования используется следующий код:
Uri sourceUri = new Uri(@"http://www.html-kit.com/tools/cookietester/");
WebClientEx webClientEx = new WebClientEx();
webClientEx.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
webClientEx.UploadString(sourceUri, "cn=MyCookieName&cv=MyCookieValue");
var text = webClientEx.DownloadString(sourceUri);
var doc = new HtmlAgilityPack.HtmlDocument();
doc.Load(new MemoryStream(Encoding.ASCII.GetBytes((text))));
var node = doc.DocumentNode.SelectNodes("//div").Single(n => n.InnerText.StartsWith("\r\nNumber of cookies received:"));
Debug.Assert(int.Parse(node.InnerText.Split(' ')[4]) == 1);
Конечно, это не отвечает на ваш вопрос; но я не вижу причин, по которым существует разница в поведении, кроме как сказать, что, возможно, это было исправлено в .NET 4.0, а исправление не было добавлено в .NET 3.5 или более ранние версии.
Я попробовал то же самое с HttpWebRequest
и столкнулся с той же проблемой (работает в 4, но не раньше):
HttpWebRequest webreq = ((HttpWebRequest) (WebRequest.Create(sourceUri)));
CookieContainer cookies = new CookieContainer();
var postdata = Encoding.ASCII.GetBytes("cn=MyCookieName&cv=MyCookieValue");
webreq.CookieContainer = cookies;
webreq.Method = "POST";
webreq.ContentLength = postdata.Length;
webreq.ContentType = "application/x-www-form-urlencoded";
Stream webstream = webreq.GetRequestStream();
webstream.Write(postdata, 0, postdata.Length);
webstream.Close();
using (WebResponse response = webreq.GetResponse())
{
webstream = response.GetResponseStream();
using (StreamReader reader = new StreamReader(webstream))
{
String responseFromServer = reader.ReadToEnd();
var doc = new HtmlAgilityPack.HtmlDocument();
doc.Load(new MemoryStream(Encoding.ASCII.GetBytes((responseFromServer))));
var node =
doc.DocumentNode.SelectNodes("//div").Single(n => n.InnerText.StartsWith("\r\nNumber of cookies received:"));
Debug.Assert(int.Parse(node.InnerText.Split(' ')[4]) == 1);
}
}
Итак, похоже, проблема с HttpWebRequest
(который использует WebClient
). Это может быть новым, потому что я видел, как люди использовали подобный код до выпуска 4.0 (может быть, до 3.50, и они говорят, что это работало).
Если это срочно, я бы посоветовал обратиться в службу поддержки Microsoft. Если у вас есть лицензия MSDN, по следующей ссылке подробно описано, как сделать запрос в службу поддержки с включенными билетами поддержки MSDN: http://msdn.microsoft.com/en-us/subscriptions/bb266240.aspx Если у вас нет MSDN, вы можете обратиться в службу поддержки, как описано здесь: https://support.microsoft.com/oas/default.aspx?Gprid=8291&st=1&wfxredirect=1&sd=gn
если это менее срочно, вы, вероятно, могли бы зарегистрировать проблему на странице http://connect.microsoft.com/VisualStudio чтобы увидеть, получите ли вы ответ с обходными путями.
person
Peter Ritchie
schedule
27.08.2012