0 / 0 / 0
Регистрация: 22.09.2016
Сообщений: 7
|
||||||
1 | ||||||
WebService await\async перестал работать22.09.2016, 20:02. Показов 3229. Ответов 11
Добрый день!
Делал первое приложение на ASP.NET WebForms, и понял что у меня весь интерфейс обрабатывается в jquery, а вот работа с бд и запросы к апи нужно переделать на WebService. Решил не грешить WCF, а запустить через стары добрый asmx, тем более у меня то все го 5 методов там. И вот скопировал я одну из функций, и она перестала работать. И не могу понять почему, и удручает меня это все больше и больше....
Добавлено через 9 минут Собственно в дебаге как и должно быть, после первого await на строке 7 меня выкидывает. По завершению времени, я вижу что завершается два потока. Но jsonString остается null.
0
|
22.09.2016, 20:02 | |
Ответы с готовыми решениями:
11
Поисковик по каталогам перестал корректно работать Сайт перестал работать после размещения на сервере WebService перестал работать после размещения на хостинге Async/ await как правильно ввести данные в async метод (консоль) |
3466 / 2476 / 696
Регистрация: 02.08.2011
Сообщений: 6,720
|
|
22.09.2016, 20:29 | 2 |
0
|
0 / 0 / 0
Регистрация: 22.09.2016
Сообщений: 7
|
|||||||||||
22.09.2016, 20:30 [ТС] | 3 | ||||||||||
изменил строку 7:
Добавлено через 35 секунд Оборачивал, так и не попал в Catch.
0
|
3466 / 2476 / 696
Регистрация: 02.08.2011
Сообщений: 6,720
|
||||||
22.09.2016, 20:56 | 4 | |||||
А зачем вам десериализация из json, а затем последующая сериализация в него?
Может проще сразу вернуть response ?+ Замечание: зачем таски городить везде, это ведь довольно емкий объект. Имхо, один раз получили строку, дальше уже можно синхронный код писать. Добавлено через 2 минуты Я бы писал так:
И смотрел бы в отладке, что там вообще возвращается.
0
|
0 / 0 / 0
Регистрация: 22.09.2016
Сообщений: 7
|
|
22.09.2016, 21:09 [ТС] | 5 |
В отладке все так и осталось, после первого же await из дебага я вываливаюь, в ответе пустой TaskString.
десериализация сохраняет все в список. Сам стринг весит 1.8 мб. После серилизациии я обрубаю 2\3 лишник полей и ужимаю его почти до 0.7 метра. На счет лишних тасков согласен, в принципе 1.8 мб при десерилизации это совсем не тот объем который нужно в await через Task пихать.
0
|
3466 / 2476 / 696
Регистрация: 02.08.2011
Сообщений: 6,720
|
|
22.09.2016, 21:25 | 6 |
Покажите, как отправляете get-запрос. Раз уж на сервере возвращается json, то клиент должен ожидать json.
То есть надо, чтобы была строка: dataType: "json" .Судя по формату ответа, это что-то похожее на soap, afaik.
0
|
0 / 0 / 0
Регистрация: 22.09.2016
Сообщений: 7
|
||||||||||||||||
22.09.2016, 21:33 [ТС] | 7 | |||||||||||||||
Для дебага захожу localhost:23421/myservice.asmx
Вызываю в jQuery:
Вызов JS:
0
|
0 / 0 / 0
Регистрация: 22.09.2016
Сообщений: 7
|
|
22.09.2016, 21:46 [ТС] | 9 |
А если страница просто html и GetAllBikeStops в WebMethod ?
Просто для понимания. await у httpclient.getAsync работает так. Поток где вызываем - сохраняет состояние. Открывается новый поток, в котором выполняется сам getasync далее по выполнению, мы должны передать результат в поток из которого вызывали. После этого поток из которого вызывали продолжит работу.
0
|
3466 / 2476 / 696
Регистрация: 02.08.2011
Сообщений: 6,720
|
|
22.09.2016, 21:55 | 10 |
Попробуйте сначала так, в первоначальном посте ведь у вас именно так, как я понял.
Попробую у себя воспроизвести, отпишусь.
0
|
0 / 0 / 0
Регистрация: 22.09.2016
Сообщений: 7
|
||||||
22.09.2016, 22:23 [ТС] | 11 | |||||
Уважаемы IamRain. Большое спасибо что убили на меня прекрасный вечер четверга, благо это не пятница.
После того, как я переносил свой код из Page в WebService, я сделал возвращаемый результат Task<string> и в ajax я должен был к ответу обращаться не как response.d а уже как response.d.Result Все работает, из за того что я смотрел результат через обложку vмоего asmx, я видел только пустой xml, который действительно генерится после первого await. Остался только вопрос, почему это работает если я не сохраняю Context. Т.е. работает, только если в Ascyn операнд добавить .ConfigureAwait(continueOnCapturedContext: false):
0
|
3466 / 2476 / 696
Регистрация: 02.08.2011
Сообщений: 6,720
|
|
22.09.2016, 23:55 | 12 |
Вот тут я сам не в курсе, но, судя по ответу Stephen Cleary, фишка ConfigureAwait(false) в том, что когда мы await-им метод с использованием ConfigureAwait(false), мы берем из пула еще один поток, выполняем код метода, при этом по завершению работы метода переключения контекста происходить обратно не будет, и весь код, который выполняется после await, будет выполняться уже в контексте потока, который использовался для await операции, чего не происходит по-умолчанию.
Я понятия не имею, как отсутствие переключения контекста влияет на возврат результата async WebMethod-ами. Буду рад, если кто объяснит. Вот схожая проблема на so, но тут нет толкового объяснения, поэтому у меня нет к статье доверия.
0
|
22.09.2016, 23:55 | |
22.09.2016, 23:55 | |
Помогаю со студенческими работами здесь
12
async/await (._. ) Async, await Async/await Async/await Async await async/await Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |