Xamarin.Form HttpClient для WebAPI не удалось в iOS - PullRequest
0 голосов
/ 24 июня 2019

Я создаю Xamarin.Forms для Android и iOS, используя WebAPI в качестве веб-службы.Все прошло хорошо в Android, но я столкнулся с ошибкой в ​​iOS, особенно при выполнении "JsonConvert.DeserializeObject".Ниже приведен пример кода

Модель

public class WsObjTest
    {
        public string name { get; set; }
        public string code { get; set; }
        public string age { get; set; }
    }

WebAPI

[HttpGet]
        public WsObjTest HelloWorld()
        {
            WsObjTest wsObjTtest = new WsObjTest();

            wsObjTtest.name = "John Doe";
            wsObjTtest.code = "ABC123";
            wsObjTtest.age = "18";

            return wsObjTtest ;
        }

В моих формах Xamarin.Forms это способ вызова и десериализации ответа

*.1010 *

Я получил ответ, как показано ниже, но в операторе возврата была выдана ошибка.

"{\" code \ ": \" ABC123 \ ", \" name \ ": \"Джон Доу", \ "age \": \ "18 \"} "

Сообщение об ошибке ниже

Необработанное исключение:

System.MemberAccessException: Невозможно создать абстрактный класс: System.Reflection.Emit.DynamicMethod произошло

Я думаю, это потому, что iOS не поддерживает JIT-компиляцию или какие-то динамические методы?Могу ли я узнать, есть ли способ преодолеть эту ошибку?Спасибо.

1 Ответ

0 голосов
/ 24 июня 2019

На основе https://docs.microsoft.com/en-us/xamarin/ios/internals/limitations, невозможно использовать любые средства, которые требуют генерации кода во время выполнения в Xamarin.iOS, потому что код на iPhone статически компилируется заранее, а не компилируется по требованию JIT-компилятором ,

Теперь мне нужно прочитать и создать объект вручную, как показано ниже. Если у кого-нибудь есть лучшее решение, поделитесь со мной.

HttpClient client = new HttpClient();

var response = await client.GetStringAsync(apiURL.Replace("##action##", "HelloWorld"));

JObject jObject = (JObject) JsonConvert.DeserializeObject(response);

WsObjTest wsObjTest = new WsObjTest();

wsObjParent.name = jObject["name"].ToString();
wsObjParent.code = jObject["code"].ToString();
wsObjParent.age = jObject["age"].ToString();

return wsObjTest;

Извлечено по ссылке

Так как ядро ​​iOS предотвращает приложение генерирует код динамически, Xamarin.iOS не поддерживать любую форму динамического генерации кода. К ним относятся:

  • System.Reflection.Emit недоступен.
  • Нет поддержки System.runtime.remoting.
  • Нет поддержки для создания типов динамически (нет Type.GetType ("MyType`1")), хотя поиск существующих типов (Type.GetType ("System.String"), например, работает просто отлично).
  • Reverse обратные вызовы должны быть зарегистрированы во время выполнения во время компиляции.

Итак, System.Reflection.Emit, таким образом, полученная ошибка.

...