powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов веб-метода через POST в C#
52 сообщений из 52, показаны все 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
Вызов веб-метода через POST в C#
    #39126072
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
        
[System.Web.Http.HttpGet]
public ResponceObject MyTest(IEnumerable<String> values)



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


Именно!
Вот зачем Вы человека в заблуждение вводите? Там же видно, что в коде полный бред, а вы Боржоми от цирроза пытаетесь спасти...
Если не сложно - укажите пожалуйста, в чем бред
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126078
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko,
Что нажать в http://localhost:24143, чтобы вызвать сервис?
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126080
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleronblestпропущено...


Именно!
Вот зачем Вы человека в заблуждение вводите? Там же видно, что в коде полный бред, а вы Боржоми от цирроза пытаетесь спасти...

Я не пытаюсь спасти код ТС , а пишу сюда код правильный с моей точки зрения
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126082
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One
Код: c#
1.
2.
3.
        
[System.Web.Http.HttpGet]
public ResponceObject MyTest(IEnumerable<String> values)



ТС,
вас выделенное не смущает?
Смущало. Поменял на HttpPost - с одной стороны, при публикации все равно совало Get, с другой - не помогло.

Посмотрите пожалуйста лучше тестовые проекты. Там этой директивы нет вообще
https://www.dropbox.com/s/0ar6ys9jed412iy/Tests.zip?dl=0
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126085
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronVadim Romanenko,
Что нажать в http://localhost:24143, чтобы вызвать сервис?
Если у Вас при запуске на порт 24143 замапился проект CallerPrj, то нажать нужно
http://localhost:24143/api/Values?MyTest
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126103
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko,
Какую версию фреймворка используете?
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126104
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,

.NET FrameWork 4.0
Проект ASP.NET MVC 4, Web Project
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126113
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoAxeleron,

.NET FrameWork 4.0
Проект ASP.NET MVC 4, Web Project

Вы же наверное понимаете, что у серверная часть у вас это web-api ASP.NET и Вы наверняка знаете, что это такое?
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126114
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blestVadim RomanenkoAxeleron,

.NET FrameWork 4.0
Проект ASP.NET MVC 4, Web Project

Вы же наверное понимаете, что у серверная часть у вас это web-api ASP.NET и Вы наверняка знаете, что это такое?

Не скажу, что я съел собаку в этом вопросе, но примерно в курсе.
А в чем соль Вашего вопроса?
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126115
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CallerPrj:
Поменяйте базовый класс с ApiController на Controller.
Код вызова:
Код: c#
1.
2.
3.
4.
5.
6.
            var client = new HttpClient();
            var values = new List<string> {"code1", "code2"};
            var url = "http://localhost:24130/api/Values?MyTest";

            HttpResponseMessage response = client.PostAsJsonAsync(url, values).Result;
            var content = response.Content.ReadAsAsync<ResponceObject>().Result;



CalledPr:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        [HttpPost]
        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);
        }
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126124
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,

и на этом тему предлагаю закрывать, пока ТС весь дом не спалил.

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

прошу прощения за вероятно дурацкий вопрос, но как мне после замены ApiController на Controller - выполнить вызов метода MyTest в CallerPrj в браузере? Тот самый метод, в котором
Код: c#
1.
2.
3.
4.
5.
6.
                var client = new HttpClient();
                var values = new List<string> { "code1", "code2" };
                var url = "http://localhost:24130/api/Values?MyTest";

                HttpResponseMessage response = client.PostAsJsonAsync(url, values).Result;
                var content = response.Content.ReadAsAsync<ResponceObject>().Result;
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126143
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenkoпрошу прощения за вероятно дурацкий вопрос, но как мне после замены ApiController на Controller - выполнить вызов метода MyTest в CallerPrj в браузере?
А зачем Вам наследоваться от ApiController в приложении, которое вызывает сервис Web API?
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126147
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko,
Очевидно, метод вызова в проекте CallerPrj будет выглядеть примерно так:
Код: c#
1.
2.
3.
4.
5.
        [HttpGet]
        public ActionResult MyTest()
        {
             .....             
        }
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126148
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronVadim Romanenkoпрошу прощения за вероятно дурацкий вопрос, но как мне после замены ApiController на Controller - выполнить вызов метода MyTest в CallerPrj в браузере?
А зачем Вам наследоваться от ApiController в приложении, которое вызывает сервис Web API?

Потому что оно само является Web API. И в оригинале, и в тесте
Тот кусок, который я попытался вытянуть в тестовые проекты - в жизни отвечает за аггрегацию данных из разных источников.
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126151
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoПотому что оно само является Web API. И в оригинале, и в тесте
По виду оба Ваших приложения похожи больше на Web апликации. Мой хрустальный шар не показал, что CallerPrj является Web API приложением :)
Но если оба являются Web API, то, разумеется, обоим надо наследоваться от ApiController.
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126156
blest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko,

клиентскую часть оставляйте как есть.

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

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

Ну вдруг кому-то придется решать аналогичную задачу.

Если не сложно - подскажите, как нужно расширить вызов
Код: c#
1.
HttpResponseMessage response = client.PostAsJsonAsync(url, values).Result;


чтоб он принимал не один параметр - массив значений, а несколько параметров?

Так же интересно узнать у blest - откуда Вы узнали что массив можно передать, создав набор параметров с именем массива и перечисленными значениями?

ПС: вдруг ссылка протухнет - вот содержимое двух самых важных классов из обоих проектов:
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.
namespace CallerPrj.Controllers
{
    public class ValuesController : ApiController
    {

        [HttpGet]
        public ResponceObject MyTest()
        {
            ResponceObject ret = new ResponceObject();
            try
            {
                var client = new HttpClient();
                var values = new List<string> { "code1", "code2" };
                var url = "http://localhost:24130/api/Values?MyTest";

                HttpResponseMessage response = client.PostAsJsonAsync(url, values).Result;
                var content = response.Content.ReadAsAsync<ResponceObject>().Result;

                ret.Value = content.Value;
                ret.Error = content.Error;
            }
            catch (Exception e)
            {
                ret.Error = e.Message;
            }
            return ret;
        }
    }
}



CalledPrj
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
namespace CalledPrj.Controllers
{
    public class ValuesController : ApiController
    {
        [HttpPost]
        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);
        }

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

клиентскую часть оставляйте как есть.

Вы серверную часть можете менять CalledPrj? Например наследоваться в нем от Controller

Нет, серверную часть я менять не могу. Я пишу ту часть, которая в тестовом примере CallerPrj. Сама является серверной частью в моем прожекте. Отвечает за сборку и аггрегацию одинаковых по сути данных от разных компаний.
Благодаря уточнениям Axeleron - тестовый прожект заработал.
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126176
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoЕсли не сложно - подскажите, как нужно расширить вызов
Код: c#
1.
HttpResponseMessage response = client.PostAsJsonAsync(url, values).Result;



чтоб он принимал не один параметр - массив значений, а несколько параметров?
Путем создания доменного класса:
Код: c#
1.
2.
3.
4.
5.
6.
    public class PowerfulDomain
    {
        public List<String> Values { get; set; }
        public DateTime Date { get; set; }
        public string FullName { get; set; }
    }



Caller:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
            var client = new HttpClient();
            var powerfulDomain = new PowerfulDomain
                {
                    Values = new List<string> { "code1", "code2" },
                    Date = DateTime.Now.AddYears(10),
                    FullName = "Hello Wolrd"
                };
            var url = "http://localhost:24130/api/Values?MyTest";

            HttpResponseMessage response = client.PostAsJsonAsync(url, powerfulDomain).Result;
            var content = response.Content.ReadAsAsync<ResponceObject>().Result;



Called:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        [HttpPost]
        public ResponceObject MyTest(PowerfulDomain powerDomain)
        {
            if (powerDomain.Values == null)
            {
                return null;
            }

            var ret = powerDomain.Values.Aggregate(string.Empty, (current, value) => current + (value + " DELIMITER "));
            return new ResponceObject("No Error", ret);
        }
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126187
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,

не-не-не, как вызвать так, чтоб был обычный перечень параметров, без доменного класса, и в том числе List?
Т.е. на стороне Called - вот такой метод, например
Код: c#
1.
public JsonResult GetValues(String companyId, Long userId, List<string> codes)



Как нужно модифицировать вызов на стороне Caller?
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39126189
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoТ.е. на стороне Called - вот такой метод, например
Код: c#
1.
public JsonResult GetValues(String companyId, Long userId, List<string> codes)




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

да все по той же самой :) Есть веб-метод, который мне нужно вызвать. У него куча параметров, один из них - массив. Вобщем-то именно таковым и является тот метод, ради которого я затевал весь этот топик
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39127211
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko,
Так если веб-метод Ваш, то вызывайте и передавайте Ваш же доменный объект класса - а внего можете напихать что душе угодно. Не вижу в чем проблема?
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39230167
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,

проблема в том, что вызываемый мною метод - написан не мной, и я не могу изменить его сигнатуру.
...
Рейтинг: 0 / 0
Вызов веб-метода через POST в C#
    #39230241
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko, попробуйте:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
using (var hc = new HttpClient())
{
    var codes = new List<string();	
    hc.BaseAddress = new Uri(serviceUrl);
    hc.DefaultRequestHeaders.Accept.Clear();
    hc.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    HttpResponseMessage response = hc.PostAsJsonAsync("", codes).Result;
}
...
Рейтинг: 0 / 0
52 сообщений из 52, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов веб-метода через POST в C#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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