Использование переносимой библиотеки классов с Webrequest и WP8

У меня есть проблема, для которой я не могу найти никакого решения, и мне трудно поверить, что я единственный, кто получает эту ошибку.

У меня есть этот фрагмент кода С# в переносимой библиотеке классов

static public void GetAnimeListFromWeb(ObservableCollection<AnimeViewModel> collection, string Url, string encodedLogin = "")
    {
        WebRequest request = WebRequest.Create(Url);
        request.Headers["Authorization"] = encodedLogin;

        IAsyncResult asyncResult = request.BeginGetResponse(new AsyncCallback( s => {
            WebResponse response = (s.AsyncState as WebRequest).EndGetResponse(s);
            XDocument doc = XDocument.Load(response.GetResponseStream());

            IEnumerable<AnimeViewModel> result = ParseAnimeXML(doc);

            collection = (ObservableCollection<AnimeViewModel>)result;

        }), request);
    }

Когда я его компилирую, он строится, и код также работает в небольшой консольной программе, которую я написал для его тестирования. Однако при тестировании в приложении для Windows Phone 8 происходит сбой на

WebResponse response = (s.AsyncState as WebRequest).EndGetResponse(s);

Он выдает исключение ArgumentException. Когда я проверил переменную 's', он сказал, что AsyncWaitHandle выдал исключение NotSupportedException.

Тогда мой вопрос: как я могу сделать правильный веб-запрос, который будет работать на всех платформах?

РЕДАКТИРОВАТЬ: Возможно, полезно отметить, что я нацелен на .NET 4.5, SL4 и выше, WP7 и выше и .NET для приложений Магазина Windows.


person Fedor Finkenflugel    schedule 09.11.2012    source источник
comment
Я не могу воспроизвести это. Игнорируйте AsyncWaitHandle, который является отвлекающим маневром и не имеет отношения к делу (мы просто не поддерживаем ожидание асинхронного результата). Это точная копия выше? Действительно ли ArgumentException исходит от EndGetResponse? Он генерирует исключение ArgumentException, когда вы передаете IAsyncResult, который не является точно таким же, как в методе request.BeginGetResponse.   -  person David Kean    schedule 09.11.2012
comment
Да, это именно тот код, на котором он падает, тестировал его несколько раз с разным синтаксисом, но все он падает в этой строке, говоря, что AsyncWaitHandle выдал NotSupportedException   -  person Fedor Finkenflugel    schedule 09.11.2012
comment
Давайте сделаем шаг назад. Можете ли вы попытаться воспроизвести в отдельном проекте Windows Phone 8, чтобы исключить переносимые библиотеки классов? Это происходит в эмуляторе? Если да, то какой эмулятор, Windows Phone 7 или Windows Phone 8?   -  person David Kean    schedule 09.11.2012
comment
Я нашел проблему при исследовании ошибки несколько лучше. Он упал, потому что заголовок авторизации получил пустую строку, что, по-видимому, приводит к сбою. И я действительно использую эмулятор WP8 WXGA.   -  person Fedor Finkenflugel    schedule 09.11.2012


Ответы (1)


На мой взгляд, вам нужно будет использовать последнюю концепцию Asyc/Await для выполнения этой задачи, такой как DownloadStringAsync. Поскольку Async/Await — единственный поддерживаемый механизм в Windows 8 и Windows Phone 8. Однако, когда вы используете этот код и создаете его для нескольких платформ, компилятор будет обрабатывать тонкости разных платформ и создавать требуемый код.

person Mayur Tendulkar    schedule 09.11.2012
comment
Это неправильно. BeginXXX и EndXX поддерживаются в Windows Phone 8. Это также не имеет ничего общего с компилятором, компилятор создает один и тот же код независимо от того, используется ли Windows 8, Phone 8 или Portable. - person David Kean; 09.11.2012
comment
Спасибо за исправление. Я был в неправильном предположении. Я думал, что единственный метод асинхронного вызова — это Async/await. - person Mayur Tendulkar; 18.11.2012
comment
Если у вас есть pcl с Windows Phone 7.5 и выше, вы можете использовать это, чтобы добавить поддержку асинхронности: Microsoft.Bcl.Async (blogs.msdn.com/b/bclteam/archive/2012/11/22/) - person Eric; 04.12.2012