ServiceStack 服务客户端调用(在桌面和 iOS 模拟器上运行良好)在 iOS 设备上运行时崩溃。该服务是 ServiceStack 文档/示例中的最小“Hello”:
public class Hello : IReturn<HelloResponse> {
public string Name { get; set; }
}
public class HelloResponse {
public string Result { get; set; }
}
我这样调用它:
IServiceClient client = new JsonApiClient("https://foobar.com/");
Hello request = new Hello { Name = "World!" };
var response = await client.ApiAsync(request);
(请注意,服务 URI 在这里无关紧要,因为崩溃发生在实际调用服务之前的设备上。)
尝试在 Visual Studio Mac OS 17.5.4 的 iPhone 上以调试模式运行此程序,
ApiAsync()
调用从 ServiceStack.Text 中抛出 ArgumentException
:
System.ArgumentException "Type ServiceTest.Hello is not of type IList<>"
at ServiceStack.Text.Common.WriteLists`2[[ServiceTest.Hello, ServiceTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[ServiceStack.Text.Json.JsonTypeSerializer, ServiceStack.Text, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]].GetWriteFn() in /home/runner/work/ServiceStack/ServiceStack/ServiceStack.Text/src/ServiceStack.Text/Common/WriteLists.cs:line 497
at ServiceStack.Text.Common.WriteLists`2[[ServiceTest.Hello, ServiceTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[ServiceStack.Text.Json.JsonTypeSerializer, ServiceStack.Text, Version=6.0.0.0, Culture=neutral, PublicKeyToken=null]]..cctor() in /home/runner/work/ServiceStack/ServiceStack/ServiceStack.Text/src/ServiceStack.Text/Common/WriteLists.cs:line 483
测试用例是最小的 net7.0-ios (Xamarin.iOS) 单项目解决方案。我试过:
.NET 6 而不是 .NET 7
JsonServiceClient
& JsonHttpClient
而不是 JsonApiClient
其他
IServiceClient
方法,例如PostAsync()
代替ApiAsync()
不同的iOS设备有不同的iOS大版本
ServiceStack 的最新版本和旧版本(6.8.0、6.7.0、6.6.0、6.5.0、6.0.2)
Xamarin 链接器设置的各种混乱,为 SS 程序集指定“linkskip”,DTO 类上的 [Preserve] 属性
其中一些变化导致了不同的崩溃,但它们似乎都与 AOT 相关
有什么想法吗? ServiceStack 是否需要一些魔法。[文本] 在 iOS 设备上工作?
不幸的是,坦率地说有点令人惊讶,但 ServiceStack 通过电子邮件通知我这种情况不受支持。
来自
[email protected]
:
这个问题看起来是由于不受支持的 Xamarin AOT 问题 平台。
和:
它曾经与旧版本的 Xamarin 一起工作,但他们的新 Xamarin 实施似乎已经打破了他们的有限支持 在他们早期的 iOS AOT 实现中有通用反射, 看起来他们将来不太可能解决这些问题 考虑到 Microsoft 计划终止支持的 Xamarin 版本 Xamarin 2024 年 5 月 1 日。