asp.net-web-api - 用于 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 编译或某种动态方法?我可以知道是否有办法克服这个错误?谢谢。
解决方案
基于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 因此我收到了错误。
推荐阅读
- c# - The "Example" task could not be loaded from the assembly - msbuild problem
- python-3.x - 是否可以为使用 python 的 sqlite3 中的主键自动增量列选择第一个值?
- excel - How to read an .xlsx file stored in the application server into an ABAP internal table?
- java - 在 spring security 3 xml 配置中启用 xframe 选项
- google-apps-script - Google Apps Script: Color a table cell on the Google Slide, based on the value of a cell on the Google Sheets
- ios - Multiple Static Libraries
- javascript - react-virtualized table row width will not change on resizing window
- python - 列表列表的基本操作
- node.js - Discord bot 使用 WokCommands 给出“无效的交互应用程序命令”
- git - git bisect 如何告诉我哪个合并破坏了主分支?