Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/14: Рейтинг темы: голосов - 14, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 3
1

Приложение, использующее HttpWebRequest для доступа к файам .png на удалённом сервере через прокси

28.05.2012, 14:45. Просмотров 2710. Ответов 2
Метки нет (Все метки)

Добрый день.

Пробую написать приложение, использующее HttpWebRequest для доступа к файам .png на удалённом сервере с установленным там IIS и NTLM аутентификацией. Составляю простенький GET-запрос вида:

GET http://servername/webservice/1.png HTTP/1.1

следующим образом:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
string file_url = "http://servername/webservice/1.png";
Uri url = new Uri(file_url);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
 
CredentialCache crCache = new CredentialCache();
crCache.Add(new Uri("http://servername/webservice/"), "NTLM", new NetworkCredential("login", "password","domain"));
req.Credentials = crCache;
 
WebProxy Prox = new WebProxy("proxy.name", 3128);
req.Proxy = null;
 
req.Headers.Add(HttpRequestHeader.KeepAlive, "true");
req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
req.Headers.Add(HttpRequestHeader.AcceptCharset, "windows-1251,utf-8;q=0.7,*;q=0.7");
req.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate, identity");
req.Headers.Add(HttpRequestHeader.AcceptLanguage, "ru,en-us;q=0.7,en;q=0.3");
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2";
string s = "";
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
System.IO.Stream stream = resp.GetResponseStream();
System.IO.StreamReader sr = new System.IO.StreamReader(stream, Encoding.GetEncoding(1251));
s = sr.ReadToEnd();
resp.Close();
stream.Close();
Если запрашивать без proxy (req.Proxy = null;), то получил 3 (!) варианта работы:
1) на GetResponse() появляется Exception либо "Удаленный сервер возвратил ошибку: (401) Несанкционированный.";
2) реже, на этой же строке, "Сервер нарушил протокол";
3) работает без ошибок.

Если включать proxy (req.Proxy = Prox;), то вариант один - "Удаленный сервер возвратил ошибку: (401) Несанкционированный.".

Причём это безобразие происходит при подключении к серверу с рабочего места. Из дома всё работает хорошо.

Хотелось бы разобраться, как достучаться до ресурса, защищённого NTLM, используя прокси?

Сделал программку на Delphi (Indy), реализующую этот же процесс - всё прекрасно работает. Сравнил в сниффере заголовки - разница в том, что в варианте на Delphi можно
отсослать на proxy заголовок "Connection: Keep-Alive" (IdHTTP1.Request.Connection := 'keep-alive';), а в варианте на C#, похоже, некоторые заголовки дописываются автоматически и задать их явно никак нельзя:( И в этом случае отсылается "Proxy-Connection: Keep-Alive".
Строка кода req.Headers.Add(HttpRequestHeader.KeepAlive, "true"); добавлет заголовк "Keep-Alive: true", но ситуацию это не меняет.

Запутал наверно) Просто много всего просмотрел, эта проблема встречается, но решение найти не смог. Есть ли у кого-нибудь идеи?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2012, 14:45
Ответы с готовыми решениями:

Создание доступа к общему каталогу находящегося на удаленном сервере
Помогите решить такую задачу: есть два сервера srv0 и srv2. Они объединены в VPN посредством двух...

Запрос HttpWebRequest через прокси
Всем привет. Делаю запрос проходящий через прокси. Делаю вот так: HttpWebRequest request =...

HttpWebRequest через прокси socks4
Здравствуйте, подскажите какое-нибудь стороннее решение, чтобы отправлять запросы HttpWebRequest...

Как запустить клиентское приложение на удаленном сервере?
Люди! Помогите советом и вправьте мозги если что :). Вот есть эта технология. Не пожалел денег,...

2
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 3
29.05.2012, 23:41  [ТС] 2
Хм. Похоже, что дело не в Keep-Alive. В обоих случаях - и в варианте Delphi, и в .NET - у меня существует keep-alive соединение, тем более, что в HTTP/1.1 оно таковым является по умолчанию. Нашёл интересное объяснение того, почему может давать сбой HttpWebRequest:

http://ferozedaud.blogspot.com... -with.html

Возможно, проблема в том, что какая-либо из сторон может не поддерживать 128-битное шифрование. Установил параметр "Требовать 128-битное шифрование" и на стороне сервера, и на клиентском компьютере. Результат тот же - без прокси работает нормально, с прокси - ошибка 401. Проверил сниффером - Negotiate Seal and Negotiate Sign установлены в 1. Возможно, что из-за этого прокси и не может передать параметры аутентификации на сервер.

Вопрос: как программно отключить "Negotiate Seal" и "Negotiate Sign"?

Нашел в msdn "contextOptions":

http://msdn.microsoft.com/en-u... tions.aspx

Но как это применить, используя HttpWebRequest?
0
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 3
04.06.2012, 16:26  [ТС] 3
Вопрос ещё актуален.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2012, 16:26

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как запустить приложение с GUI на удаленном сервере?
Собственно есть чисто виндузовое приложение с GUI и его нужно запустить на удаленном сервере с...

Post запрос HttpWebRequest через прокси socks5
Есть код простого пост запроса string POST(string url, string data) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.