适用于WebAPI的Xamarin.Form HttpClient在iOS中失败

时间:2019-06-24 02:28:26

标签: asp.net-web-api xamarin.forms xamarin.ios json.net httpclient

我正在使用WebAPI作为Web服务为Android和iOS创建Xamarin.Forms。整个事情在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中,这就是调用和反序列化响应的方式

HttpClient client = new HttpClient();

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

return JsonConvert.DeserializeObject<WsObjTest>(response); //ERROR HERE

我得到了如下响应,但是在return语句上抛出了错误。

  

“ {\” code \“:\” ABC123 \“,\”名称\“:\” John Doe \“,\”年龄\“:\” 18 \“}”

错误消息在下面

  

未处理的异常:

     

System.MemberAccessException:无法创建抽象类:   发生System.Reflection.Emit.DynamicMethod

我认为这是因为iOS不支持JIT编译或某种动态方法吗?我是否可以解决这个错误?谢谢。

1 个答案:

答案 0 :(得分:0)

基于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”)可以正常工作)。
  •   
  • 反向   回调必须在编译时在运行时注册。
  •   

因此System.Reflection.Emit发出了我收到的错误。