首页 > 解决方案 > 用于 WebAPI 的 Xamarin.Form HttpClient 在 iOS 中失败

问题描述

我正在使用 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; }
    }

网络API

[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\",\"name\":\"John Doe\",\"age\":\"18\"}"

错误信息如下

未处理的异常:

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

我认为这是因为 iOS 不支持 JIT 编译或某种动态方法?我可以知道是否有办法克服这个错误?谢谢。

标签: asp.net-web-apixamarin.formsxamarin.iosjson.nethttpclient

解决方案


基于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 因此我收到了错误。


推荐阅读