Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
babaevkamil
5 / 5 / 3
Регистрация: 17.10.2012
Сообщений: 116
Завершенные тесты: 1
1

В System.Net нет класса WebClient

21.12.2016, 19:45. Просмотров 1374. Ответов 26

Создал проект "Библиотека классов (переносимая для iOS, Android и Windows)".
Подключил System.Net, а класса WebClient нет. Пробовал напрямую подключить System.Net.WebClient, но так тоже не работает.
Хотя в другом проекте WinForm всё работает.
Может кто подскажет в чём может быть проблема?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2016, 19:45
Ответы с готовыми решениями:

Не найден класс System.Net.WebClient
Добрый день, друзья. Давно не пользовался С# и поэтому возвращаюсь в форум для начинающих. У...

Как правильно подружить System.Net.Sockets и System.Net.WebSockets?
К примеру есть 2 разных проекта: 1. Чат с веб-мордой (Веб-приложение) 2. Консольный чат...

Нет класса ProtectedData (.NET 4.5)
Работаю в visual studio 2015, подключаю пространство имён using System.Security.Cryptography; ...

Проблема с методом Send у класса System.Net.Sockets.Socket
Привет всем! Вот фрагмент кода: private Socket FSocket; protected override void...

Описание класса WebClient
Интересует максимально широкое описание класса WebClient и всех его методов. Особенно метод...

26
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9690 / 4067
Регистрация: 17.03.2014
Сообщений: 19,333
Записей в блоге: 1
Завершенные тесты: 2
21.12.2016, 20:36 2
babaevkamil, обязательно использовать WebClient? Как насчет HttpClient в виде nuget пакета?
0
babaevkamil
5 / 5 / 3
Регистрация: 17.10.2012
Сообщений: 116
Завершенные тесты: 1
21.12.2016, 20:38  [ТС] 3
OwenGlendower, а он не громоздкий? и где посмотреть примеры GET/POST запросов на нём?
В System.Net нет класса WebClient

Наткнулся на две версии.. В чём разница между той, что вы предложили (2.2.29) и 4.3.0?
0
babaevkamil
5 / 5 / 3
Регистрация: 17.10.2012
Сообщений: 116
Завершенные тесты: 1
21.12.2016, 21:23  [ТС] 4
Вроде нашёл доки по HttpClient
https://msdn.microsoft.com/ru-ru/lib...v=vs.118).aspx
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9690 / 4067
Регистрация: 17.03.2014
Сообщений: 19,333
Записей в блоге: 1
Завершенные тесты: 2
21.12.2016, 22:34 5
babaevkamil, System.Net.Http используется в .NET Core. Microsoft.Net.Http предназначен для .NET Framework.

Документацию ты уже нашел самостоятельно.
0
babaevkamil
5 / 5 / 3
Регистрация: 17.10.2012
Сообщений: 116
Завершенные тесты: 1
21.12.2016, 22:39  [ТС] 6
OwenGlendower, я, кстати, не смог найти как задавать через HttpClient заговолки и кодировку.. в доках нет инфы..
например в WebClient это делалось так..
C#
1
2
3
4
5
using (var webClient = new WebClient())
{
     webClient.Encoding = Encoding.UTF8;
     webClient.Headers.Add("X-User-Nickname", "login");
}
а как подобное сделать в HttpClient?
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9690 / 4067
Регистрация: 17.03.2014
Сообщений: 19,333
Записей в блоге: 1
Завершенные тесты: 2
21.12.2016, 23:15 7
babaevkamil, кодировку для httpclient указывать не надо т.к. он умеет отпределять её автоматически в отличие от WebClient. Заголовки указываются через свойство DefaultRequestHeaders
C#
1
2
3
4
using (HttpClient http = new HttpClient())
{
    http.DefaultRequestHeaders.Add("X-User-Nickname", "nickname");
}
1
babaevkamil
5 / 5 / 3
Регистрация: 17.10.2012
Сообщений: 116
Завершенные тесты: 1
22.12.2016, 20:46  [ТС] 8
OwenGlendower, спасибо.
и ещё, я не совсем разобрался.. как мне отправить строку post запросом и принять ответ в виде строки? Метод PostAsync требует HttpContent, но я не понял как в него преобразовать строку. сам класс абстрактный, так что и экземпляр я создать не могу =/

отдать я должен что-то вроде этого: "user_rate[episodes]=12&user_rate[score]=9&user_rate[status]=2"
а принять строку в формате json..
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9690 / 4067
Регистрация: 17.03.2014
Сообщений: 19,333
Записей в блоге: 1
Завершенные тесты: 2
23.12.2016, 04:37 9
babaevkamil, нужно использовать классы-наследники от HttpContent. Например, FormUrlEncodedContent.
C#
1
2
3
4
5
6
7
8
9
10
using (var http = new HttpClient())
{
    var postContent = new FormUrlEncodedContent(new Dictionary<string,string>{
        {"user_rate[episodes]", "12"},
        {"user_rate[score]", "9"},
        {"user_rate[status]", "2"}
    });
    HttpResponseMessage response = await http.PostAsync("http://example.com", postContent);
    string json = await response.Content.ReadAsStringAsync();
}
0
babaevkamil
5 / 5 / 3
Регистрация: 17.10.2012
Сообщений: 116
Завершенные тесты: 1
23.12.2016, 14:30  [ТС] 10
OwenGlendower, пробовал.. сервер не воспринимает ключ-значение.. ему нужна именно строка в указанном выше формате =/ либо я чего-то не догоняю..
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9690 / 4067
Регистрация: 17.03.2014
Сообщений: 19,333
Записей в блоге: 1
Завершенные тесты: 2
23.12.2016, 17:33 11
babaevkamil, попробуй тогда StringContent использовать.
1
babaevkamil
5 / 5 / 3
Регистрация: 17.10.2012
Сообщений: 116
Завершенные тесты: 1
23.12.2016, 23:43  [ТС] 12
OwenGlendower, надеюсь я вас не сильно задолбал своими вопросами, но не пойму почему HttpClient не хочет принимать подобный заголовок?
C#
1
httpClient.DefaultRequestHeaders.Add("Content-Type", "application/x-www-form-urlencoded");
Ошибка

System.InvalidOperationException не обработано
HResult=-2146233079
Message=Неправильное имя заголовка. Убедитесь, что заголовки запросов используются с HttpRequestMessage, заголовки ответов — с HttpResponseMessage, а заголовки содержимого — с объектами HttpContent.
Source=System.Net.Http
StackTrace:
в System.Net.Http.Headers.HttpHeaders.CheckHeaderName(String name)
в System.Net.Http.Headers.HttpHeaders.Add(String name, String value)
в ShikiAPILib.Methods.GetAccessTokenPost(String user_nickname, String user_password) в D:\Clouds\OneDrive\Documents\Visual Studio 2015\Projects\!Experemental\ShikiAPILib_ForTest\ShikiAPILib\APIMethods.cs:строка 43
в ShikiTestApp.Program.Main(String[] args) в D:\Clouds\OneDrive\Documents\Visual Studio 2015\Projects\!Experemental\ShikiTestApp\ShikiTestApp\Program.cs:строка 15
в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()
InnerException:

0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9690 / 4067
Регистрация: 17.03.2014
Сообщений: 19,333
Записей в блоге: 1
Завершенные тесты: 2
23.12.2016, 23:58 13
babaevkamil, в ошибке все сказано. Не там заголовок указываешь. Нужно использовать свойство Headers у класса HttpContent.
1
babaevkamil
5 / 5 / 3
Регистрация: 17.10.2012
Сообщений: 116
Завершенные тесты: 1
23.12.2016, 23:59  [ТС] 14
OwenGlendower, каким образом указывать? не совсем понял.. можно пример, если не сложно?
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9690 / 4067
Регистрация: 17.03.2014
Сообщений: 19,333
Записей в блоге: 1
Завершенные тесты: 2
24.12.2016, 00:08 15
babaevkamil,
C#
1
2
3
4
5
6
using (var http = new HttpClient())
{
    var postContent = new StringContent("x=123&y=привет", Encoding.UTF8, "application/x-www-form-urlencoded");
    HttpResponseMessage response = await http.PostAsync("http://httpbin.org/post", postContent);
    string json = await response.Content.ReadAsStringAsync();
}
1
babaevkamil
5 / 5 / 3
Регистрация: 17.10.2012
Сообщений: 116
Завершенные тесты: 1
24.12.2016, 00:48  [ТС] 16
OwenGlendower, чего-то в этих заголовках я не учитываю =/
создатель сайта говорит, что пост запросы требуют загоовок только для json отправки.. но я пробовал и так и этак..
решил отправить json с соответствующим заголовком
кавычки в коде у меня экранированы, но форум почему-то сам их удаляет.. ниже скрин для верности
В System.Net нет класса WebClient

C#
1
2
3
4
string post = "{"nickname": "" + user_nickname + "", "password": "" + user_password + ""}";
var content = new StringContent(post, Encoding.UTF8, "application/json");
 
var response = httpClient.PostAsync(_domen + "access_token", content).Result.Content.ReadAsStringAsync().Result;
запрос вроде доходит до сервера, но на выходе я получаю корректный json, но со значением null, вместо токена..
то есть мои логин/пароль как-то коряво получаются на стороне сервера.. =/
вот ответ с сервера.. при успешном запросе, вместо нул должен вернуться токен (набор символов)
"{"api_access_token":null}"
0
OwenGlendower
Супер-модератор
Эксперт .NET
11507 / 9690 / 4067
Регистрация: 17.03.2014
Сообщений: 19,333
Записей в блоге: 1
Завершенные тесты: 2
24.12.2016, 07:27 17
babaevkamil, в таких случаях надо сравнивать запрос отправляемый программой с правильным запросом. Или просто посмотреть точное содержимое отправленного запроса. Советую установить веб-отладчик Fiddler, запустить его, настроить код на его использование (см. ниже) и посмотреть запросы.
C#
1
2
3
4
5
using (var handler = new HttpClientHandler() { Proxy = new WebProxy("http://localhost:8888", false), UseProxy = true})
using (var http = new HttpClient(handler))
{
...
}
0
babaevkamil
5 / 5 / 3
Регистрация: 17.10.2012
Сообщений: 116
Завершенные тесты: 1
24.12.2016, 22:01  [ТС] 18
Цитата Сообщение от OwenGlendower Посмотреть сообщение
http://localhost:8888"
это пример урл запроса или этот код мне нужно дословно вставить?

студия не знает WebProxy. System.Net подключён.. =/
0
babaevkamil
5 / 5 / 3
Регистрация: 17.10.2012
Сообщений: 116
Завершенные тесты: 1
24.12.2016, 22:18  [ТС] 19
В System.Net нет класса WebClient

вот запустил прогу без всяких надстроек... так как ругался на WebProxy..
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        private static string _domen = "http://shikimori.org/api/";
        ...
        public static string GetAccessTokenPost(string user_nickname, string user_password)
        {
            using (var httpClient = new HttpClient())
            {
                string post = "{"nickname": "" + user_nickname + "", "password": "" + user_password + ""}";
                var content = new StringContent(post, Encoding.UTF8, "application/json");
 
                var response = httpClient.PostAsync(_domen + "access_token", content).Result.Content.ReadAsStringAsync().Result;
                var accesstoken = JsonConvert.DeserializeObject<_AccessTokenJson>(response);
 
                if (accesstoken.api_access_token == null || accesstoken.api_access_token.Trim() == String.Empty || accesstoken.api_access_token.Trim() == "")
                {
                    throw new Exception("Неверный логин/пароль!");
                }
 
                return accesstoken.api_access_token;
            }
        }
0
babaevkamil
5 / 5 / 3
Регистрация: 17.10.2012
Сообщений: 116
Завершенные тесты: 1
24.12.2016, 22:55  [ТС] 20
Информация с вкладки "RAW"
Код
POST http://shikimori.org/api/access_token HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: shikimori.org
Content-Length: 40
Expect: 100-continue

{"nickname": "test2", "password": "123"}
и чёт я не пойму, что может быть не так =/

Добавлено через 25 минут
Я даже в консольном приложении попробовал через WebCient отправить POST запрос в разных форматах, в том числе и JSON. в ответ всё равно возвращается null
Что я упускаю? Логин и пароль однозначно верные. Гет запросы тоже проходят нормально.. =/
0
24.12.2016, 22:55
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2016, 22:55

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

Замена WebClient в .NET Compact Framework
Я использую WebClient для авторизации при помощи куки на веб-сервисе, но в Compact Framework...

Необработанное исключение типа "System.Net.Sockets.SocketException" в System.dll
Доброго времени суток! Есть следующая статья: Разработка прокси-сервера на C# В самом конце есть...

Кеширование результата работы Webclient.DownloadStringAsync() (Windows Phone 8 Webclient)
Всем привет. Приложение для Windows Phone 8. Запускаю под дебагом. Обращаюсь на локальный...


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

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

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