Различные статьи (1, 2) я обнаружил, делают этот взгляд достаточно легким:
WebRequest request = HttpWebRequest.Create(url);
var credentialCache = new CredentialCache();
credentialCache.Add(
new Uri(url), // request url
"Digest", // authentication type
new NetworkCredential("user", "password") // credentials
);
request.Credentials = credentialCache;
Однако это только работает на URL без параметров URL. Например, я могу загрузить http://example.com/test/xyz.html
очень хорошо, но когда я пытаюсь загрузить http://example.com/test?page=xyz
, результатом являются 400 Плохих сообщений Запроса со следующим в журналах сервера (рабочий Apache 2.2):
Digest: uri mismatch - does not match request-uri
Моя первая идея состояла в том, что спецификация обзора требует, чтобы параметры URL были удалены из хеша обзора - но удаление параметра от URL передало credentialCache.Add()
не изменил вещь. Таким образом, это должно быть наоборот, и где-нибудь в.NET платформа неправильно удаляет параметр из URL.
Я думаю, что второй URL-адрес указывает на динамическую страницу, и вы должны сначала вызвать его с помощью GET, чтобы получить HTML, а затем загрузить его. Однако опыта в этой области нет.
Вы сказали, что удалили параметры строки запроса, но пытались ли вы полностью вернуться к хосту? Каждый пример CredentialsCache.Add (), который я видел, похоже, использует только хост, а в документации для CredentialsCache.Add () параметр Uri указан как «uriPrefix», что кажется красноречивым.
Другими словами, попробуйте следующее:
Uri uri = new Uri(url);
WebRequest request = WebRequest.Create(uri);
var credentialCache = new CredentialCache();
credentialCache.Add(
new Uri(uri.GetLeftPart(UriPartial.Authority)), // request url's host
"Digest", // authentication type
new NetworkCredential("user", "password") // credentials
);
request.Credentials = credentialCache;
Если это сработает, вам также нужно будет убедиться, что вы не добавляете одни и те же «полномочия» в кеш более одного раза ... все запросы к одному и тому же хост должен иметь возможность использовать ту же запись в кэше учетных данных.