powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов веб-метода через POST в C#
25 сообщений из 52, страница 1 из 3
Вызов веб-метода через POST в C#
    #39125336
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!

Есть некое приложение на шарпе. Нужно вызвать метод развернутого веб-приложения ASP.NET MVC. При этом есть два момента:
- в удаленном методе один из параметров - List<String>
- вызов нужно сделать методом POST

Для определенности - сигнатура удаленного метода
Код: c#
1.
public JsonResult GetValues(List<string> codes)



Хотелось бы реализовать без использования сторонних библиотек.
Ну и еще момент для определенности - вызов выполняю из контроллера своего ASP.NET MVC приложения, .NET FrameWork 4

ПС: кучу примеров по вызову через POST - видел. Но там везде какого-то фига передают строки через POST

Заранее спасибо!
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125342
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoНо там везде какого-то фига передают строки через POST
json-данные - тож строка
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125350
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилjson-данные - тож строка
Я понимаю. Но с той стороны почему-то не хотят понимать лист как строку.
Переделываю из такого вызова:
Код: c#
1.
2.
3.
4.
5.
6.
 using (var wb = new System.Net.WebClient())
            {
                URL += "Global/GetValues?"Codes=" + ((Codes == null) ? "" : Newtonsoft.Json.JsonConvert.SerializeObject(Codes));
                log.Info(URL);
                var response = wb.DownloadString(URL);
                dynamic res = Newtonsoft.Json.JsonConvert.DeserializeObject(response);


Указанным выше способом - не работает. Хотя если код один и его передаю просто как строку - то работает... Забавная ситуация.
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125423
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoИзопропилjson-данные - тож строка
Я понимаю. Но с той стороны почему-то не хотят понимать лист как строку.
Переделываю из такого вызова:
Код: c#
1.
2.
3.
4.
5.
6.
 using (var wb = new System.Net.WebClient())
            {
                URL += "Global/GetValues?"Codes=" + ((Codes == null) ? "" : Newtonsoft.Json.JsonConvert.SerializeObject(Codes));
                log.Info(URL);
                var response = wb.DownloadString(URL);
                dynamic res = Newtonsoft.Json.JsonConvert.DeserializeObject(response);


Указанным выше способом - не работает. Хотя если код один и его передаю просто как строку - то работает... Забавная ситуация.

Жестишь. А че вообще весь код в кавычки не возьмешь?
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125653
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoИзопропилjson-данные - тож строка
Я понимаю. Но с той стороны почему-то не хотят понимать лист как строку.
Переделываю из такого вызова:
Код: c#
1.
2.
3.
4.
5.
6.
 using (var wb = new System.Net.WebClient())
            {
                URL += "Global/GetValues?"Codes=" + ((Codes == null) ? "" : Newtonsoft.Json.JsonConvert.SerializeObject(Codes));
                log.Info(URL);
                var response = wb.DownloadString(URL);
                dynamic res = Newtonsoft.Json.JsonConvert.DeserializeObject(response);


Указанным выше способом - не работает. Хотя если код один и его передаю просто как строку - то работает... Забавная ситуация.

Вы сами это придумали или где-то нашли?

Посмотрите на один из тысячи примеров и сделайте также
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125826
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MonochromatiqueVadim Romanenkoпропущено...

Я понимаю. Но с той стороны почему-то не хотят понимать лист как строку.
Переделываю из такого вызова:
Код: c#
1.
2.
3.
4.
5.
6.
 using (var wb = new System.Net.WebClient())
            {
                URL += "Global/GetValues?"Codes=" + ((Codes == null) ? "" : Newtonsoft.Json.JsonConvert.SerializeObject(Codes));
                log.Info(URL);
                var response = wb.DownloadString(URL);
                dynamic res = Newtonsoft.Json.JsonConvert.DeserializeObject(response);


Указанным выше способом - не работает. Хотя если код один и его передаю просто как строку - то работает... Забавная ситуация.

Жестишь. А че вообще весь код в кавычки не возьмешь?

А какой смысл выдумывать произведение Шекспира для вызова определенного веб-метода?
Ну а если такой смысл есть - напишите, пожалуйста, какой-нибудь пример, если не сложно

blestВы сами это придумали или где-то нашли?

Посмотрите на один из тысячи примеров и сделайте также
Уважаемый blest, уже перелопатил кучу примеров, но, как и писалось в стартпосте, люди передают исключительно строки. Найти пример с передачей массивов или сложных объектов пока не получилось.
Отдельной проблемой видится то, что люди показывают пример вызова, но не показывают сигнатуру вызываемой стороны.
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125838
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko,

ок. Напишите пожалуйста тип (.Net) который вы ходите получить в результате запроса?
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125851
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blest,

пусть метод GetValues будет возвращать обернутым в JSON List<MyValue>, где MyValue будет классом, имеющим два свойства типа String - code и value.
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125860
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoПосмотрите на один из тысячи примеров и сделайте также
Уважаемый blest, уже перелопатил кучу примеров, но, как и писалось в стартпосте, люди передают исключительно строки. Найти пример с передачей массивов или сложных объектов пока не получилось.
Отдельной проблемой видится то, что люди показывают пример вызова, но не показывают сигнатуру вызываемой стороны.[/quot]

У вас проблема с сигнатурой List<string> ?

Вот конкретный пример
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
                HttpClient client = new HttpClient();

                var pairs = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("codes", "code1"),
        new KeyValuePair<string, string>("codes", "codes2")
    };

                var content = new FormUrlEncodedContent(pairs);

                var response = client.PostAsync(url, content).Result;

                if (response.IsSuccessStatusCode)
                {


                }



Для распарсивания стринги в Json формате можете использовать например JsonConvert
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125890
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут , например, постят файлы с разными параметрами.
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125919
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blest,

попробовал вот так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
using (var wb = new System.Net.WebClient())
            {
                URL += "Global/GetValues";

                wb.QueryString.Add("codes", ((codes== null) ? "" : Newtonsoft.Json.JsonConvert.SerializeObject(codes)));

                var responseBytes = wb.UploadValues(URL, "POST", wb.QueryString);



не прокатило. По какой-то причине codes, содержащий две строки, воспринимается на удаленной стороне как List из одной строки, содержащий обе исходных. Единственная строка в List -имеет такой вид:
Код: plaintext
["CODE1","CODE2"]

Т.е. передавался List из двух строк, а у принимающей стороны - оказался List из одной строки...

ПС: я, видимо, некорректно уточнил вопрос. Я вызываю некий метод, принимающий один параметр - List<String>. А возвращает этот метод сложный объект
На всякий случай - еще раз сигнатура удаленного метода:
Код: c#
1.
public JsonResult GetValues(List<string> codes)
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125936
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenkoblest,

попробовал вот так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
using (var wb = new System.Net.WebClient())
            {
                URL += "Global/GetValues";

                wb.QueryString.Add("codes", ((codes== null) ? "" : Newtonsoft.Json.JsonConvert.SerializeObject(codes)));

                var responseBytes = wb.UploadValues(URL, "POST", wb.QueryString);



не прокатило. По какой-то причине codes, содержащий две строки, воспринимается на удаленной стороне как List из одной строки, содержащий обе исходных. Единственная строка в List -имеет такой вид:
Код: plaintext
["CODE1","CODE2"]

Т.е. передавался List из двух строк, а у принимающей стороны - оказался List из одной строки...

ПС: я, видимо, некорректно уточнил вопрос. Я вызываю некий метод, принимающий один параметр - List<String>. А возвращает этот метод сложный объект
На всякий случай - еще раз сигнатура удаленного метода:
Код: c#
1.
public JsonResult GetValues(List<string> codes)



Вадим, Вы попробовали мой вариант запроса? Если он выполняется успешно (что верно на 100%) конвертируйте его уже в любой свой вариант.

Далее Вам уже сказали JsonResult это и есть строка, просто эта строка имеет Json-форма
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125947
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blest,

повторюсь. У меня нет проблем с тем, чтоб разобрать РЕЗУЛЬТАТ выполнения веб-метода. У меня проблема с ПЕРЕДАЧЕЙ этому веб-методу параметра, объявленного как List<String>.

Ваш вариант сейчас попробую
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125956
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blest,

Вот и результат.
Код из прожекта:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
                    String URL = "http://localhost:3890/Apps/MyTest";
                    List<String> values = new List<string>();
                    values.Add("code1");
                    values.Add("code2");
                    
                    HttpClient client = new HttpClient();
                    var pairs = new List<KeyValuePair<string, string>>
                    {
                        new KeyValuePair<string, string>("values", Newtonsoft.Json.JsonConvert.SerializeObject(values))
                    };

                    var content = new FormUrlEncodedContent(pairs);

                    var response = client.PostAsync(URL, content).Result;

                    if (response.IsSuccessStatusCode)
                    {


                    }


При этом вот код вызываемого тестового удаленного метода
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        [System.Web.Http.AcceptVerbs("GET","POST")]
        [System.Web.Http.HttpGet]
        public ResponceObject MyTest(IEnumerable<String> values)
        {
            if (values == null)
                return null;
            String ret = "";
            foreach (String value in values)
                ret += value + " DELIMITER ";

            return new ResponceObject("No Error", ret);
        }



После вызова response.IsSuccessStatusCode == false
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39125963
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я был неправ. Стоит директива HttpGet. но почему-то при смене на HttpPost - тестовый сервис публикуется с доступом только через GET.
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126011
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак, решил начать с чистого листа.

Создано 2 тестовых проекта ASP.NET MVC 4.
Скачать их можно здесь
Если вкратце, то метод в проекте CallerPrj вызывает метод проекта CalledPrj. Сначала запускаем проект CalledPrj, соответственно меняем URL в проекте CallerPrj, запускаем и переходим по условному адресу
http://localhost:24143/api/Values?MyTest

Если поставить breakpoint в проекте CalledPrj.ValuesController.MyTest, то увидим, что массив пришел абсолютно пустым.

И вот возникает вопрос - что же я делаю не так ??

Если вкратце, то содержимое главного вызываемого метода проекта CalledPrj:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        public ResponceObject MyTest(List<String> values)
        {
            if (values == null)
                return null;
            String ret = "";
            foreach (String value in values)
                ret += value + " DELIMITER ";

            return new ResponceObject("No Error", ret);
        }



и код вызывающего метода проекта CallerPrj:
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
        [HttpGet]
        public ResponceObject MyTest()
        {
            
            ResponceObject ret = new ResponceObject();
            try
            {
                using (var wb = new System.Net.WebClient())
                {
                    String URL = "http://localhost:24130/api/Values";
                    List<String> values = new List<string>();
                    values.Add("code1");
                    values.Add("code2");


                    WebClient wc = new WebClient();

                    wc.QueryString.Add("values", Newtonsoft.Json.JsonConvert.SerializeObject(values));

                    var data = wc.UploadValues(URL, "POST", wc.QueryString);

                    // data here is optional, in case we recieve any string data back from the POST request.
                    var responseString = UnicodeEncoding.UTF8.GetString(data);

                    
                }
            }
            catch (Exception e)
            {
                ret.Error = e.Message;
                
            }
            return ret;
        }
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126037
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko,

Смешались в кучу кони, люди...

Клиентскую часть сделайте в точности по моему примеру

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
HttpClient client = new HttpClient();

                var pairs = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("values", "code1"),
        new KeyValuePair<string, string>("values", "codes2")
    };

                var content = new FormUrlEncodedContent(pairs);

                var response = client.PostAsync(url, content).Result;

                if (response.IsSuccessStatusCode)
                {


                }



Сколько значений при этом попадет в метод MyTest(List<String> values) ?
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126043
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blest,

если я правильно понимаю сигнатуру использованного Вами метода, то Вы предлагаете вызвать некий метод по некоему url с двумя строковыми параметрами с одинаковым именем. А не с одним параметром типа List<String>.
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126046
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoЕсли поставить breakpoint в проекте CalledPrj.ValuesController.MyTest, то увидим, что массив пришел абсолютно пустым.
В Вашем коде не нашел вызова этого метода...
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126049
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blest,

Я понял суть Вашей идеи :)
Попробовал вот так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
                    HttpClient client = new HttpClient();
                    var pairs = new List<KeyValuePair<string, string>>
                    {
                        new KeyValuePair<string, string>("values", "value1"),
                        new KeyValuePair<string, string>("values", "value2")
                    };

                    var content = new FormUrlEncodedContent(pairs);

                    var response = client.PostAsync(URL, content).Result;

                    if (response.IsSuccessStatusCode)
                    {


                    }


но, к сожалению, в результате все равно пустой List в CalledPrj
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126050
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вручную править Ваш код, чтобы еще и вызов делать, лень. Так бы сказал что не так.
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126058
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenkoblest,

если я правильно понимаю сигнатуру использованного Вами метода, то Вы предлагаете вызвать некий метод по некоему url с двумя строковыми параметрами с одинаковым именем. А не с одним параметром типа List<String>.

Именно!
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126063
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,

поправил код по Вашему замечанию.

blest,

Плюс добавил два метода вызова последовательно.
https://www.dropbox.com/s/0ar6ys9jed412iy/Tests.zip?dl=0
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126065
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestVadim Romanenkoblest,

если я правильно понимаю сигнатуру использованного Вами метода, то Вы предлагаете вызвать некий метод по некоему url с двумя строковыми параметрами с одинаковым именем. А не с одним параметром типа List<String>.

Именно!
Не получилось. В обновленных сырцах - то, как вызывалось в соответствии с Вашим предложением
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126068
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestVadim Romanenkoblest,

если я правильно понимаю сигнатуру использованного Вами метода, то Вы предлагаете вызвать некий метод по некоему url с двумя строковыми параметрами с одинаковым именем. А не с одним параметром типа List<String>.

Именно!
Вот зачем Вы человека в заблуждение вводите? Там же видно, что в коде полный бред, а вы Боржоми от цирроза пытаетесь спасти...
...
Рейтинг: 0 / 0
25 сообщений из 52, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов веб-метода через POST в C#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]