Odpowiedź dlev zakończyła się, ale miałem problemy z implementacją rozwiązania ("Parametr" {0} "nie może być pustym ciągiem."), Więc zdecydowałem napisać pełny kod na wypadek, gdyby ktoś miał podobne problemy .
Moim celem było pobranie html jako napisu, ale musiałem dodać pliki cookie do żądania sieci. Jest to funkcja, która pobiera ciąg za pomocą cookies:
public static string DownloadString(string url, Encoding encoding, IDictionary<string, string> cookieNameValues)
{
using (var webClient = new WebClient())
{
var uri = new Uri(url);
var webRequest = WebRequest.Create(uri);
foreach(var nameValue in cookieNameValues)
{
webRequest.TryAddCookie(new Cookie(nameValue.Key, nameValue.Value, "/", uri.Host));
}
var response = webRequest.GetResponse();
var receiveStream = response.GetResponseStream();
var readStream = new StreamReader(receiveStream, encoding);
var htmlCode = readStream.ReadToEnd();
return htmlCode;
}
}
Jesteśmy przy użyciu kodu z dlev za odpowiedź:
public static bool TryAddCookie(this WebRequest webRequest, Cookie cookie)
{
HttpWebRequest httpRequest = webRequest as HttpWebRequest;
if (httpRequest == null)
{
return false;
}
if (httpRequest.CookieContainer == null)
{
httpRequest.CookieContainer = new CookieContainer();
}
httpRequest.CookieContainer.Add(cookie);
return true;
}
W ten sposób można korzystać z pełnej kod:
var cookieNameValues = new Dictionary<string, string>();
cookieNameValues.Add("varName", "varValue");
var htmlResult = DownloadString(url, Encoding.UTF8, cookieNameValues);
To byłoby trudne, ponieważ ciasteczka są koncepcją HTTP. Czy jest jakiś powód, dla którego musisz dokonać tej zmiany? – dlev
@dlev - WebRequest utworzy HttpWebRequest na podstawie uri. Dlatego, jeśli chcę wykpić swój własny obiekt WebRequest i/lub zarejestrować mój własny uri, który również zwraca WebRequest, to nie chcę ograniczać metody tylko do pracy z obiektem HttpWebRequest. –
Rozumiem, że typem run-time 'webRequest' będzie' HttpWebRequest'. Ale dostęp do 'CookieContainer' wymaga, aby typem kompilacji był' HttpWebRequest'. Wspomniałeś również, że nie ograniczasz się do HTTP, ale w tym przypadku pliki cookie nie mają większego znaczenia, ponieważ są konstrukcją HTTP (co jest przyczyną ich braku w "WebRequest".) – dlev