You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在最新.NET中使用ServiceStack客户端启用PublishAot报错的解决咨询

ServiceStack客户端AOT发布报错问题

我有一个简单的ServiceStack客户端程序:

var client = new ServiceStack.JsonServiceClient
{
    BaseUri = "https://jsonplaceholder.typicode.com/"
};

var results = await client.GetAsync<List<fake>>("posts");

Console.WriteLine($"got {results.Result.Count}");

class fake
{
    public int userid { get; set; }
    public int id { get; set; }
    public string title { get; set; }
    public string body { get; set; }
}

该程序运行正常,输出"got 100"。但当我在csproj文件中添加<PublishAot>true</PublishAot>并发布后,出现如下错误:

Unhandled exception. System.AggregateException: One or more errors occurred. (Value cannot be null. (Parameter 'method'))
 ---&gt; System.ArgumentNullException: Value cannot be null. (Parameter 'method')
   at ServiceStack.AsyncServiceClient.&lt;SendWebRequestAsync&gt;d__159`1.MoveNext() + 0x1b4d
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean) + 0x72
   at Program.&lt;Main&gt;$(String[] args) + 0xef

请问ServiceStack是否支持AOT?需要进行哪些特殊配置才能使其正常工作?


ServiceStack从v6.11+版本开始正式支持AOT编译,你遇到的报错是因为AOT环境下缺少必要的反射元数据配置,且原生客户端依赖的反射序列化逻辑无法在AOT环境中正常运行。

需要做以下几项配置和代码调整:

  • 升级ServiceStack版本:必须将ServiceStack相关包升级到v6.11或更高版本,旧版本未做AOT适配。
  • 使用AOT专用客户端:替换JsonServiceClient为AotJsonServiceClient,这个客户端是专为AOT环境设计的序列化实现:
    var client = new ServiceStack.AotJsonServiceClient
    {
        BaseUri = "https://jsonplaceholder.typicode.com/"
    };
    
  • 添加AOT元数据配置:在项目中创建rd.xml文件,配置必要的反射元数据,确保AOT编译器能正确处理ServiceStack的类型:
    <Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
      <Application>
        <Assembly Name="ServiceStack" Dynamic="Required All" />
        <Assembly Name="ServiceStack.Client" Dynamic="Required All" />
        <!-- 替换为你的项目程序集名称 -->
        <Assembly Name="YourProjectAssemblyName" Dynamic="Required All" />
      </Application>
    </Directives>
    
    并在csproj中引用该文件:
    <ItemGroup>
      <RdXmlFile Include="rd.xml" />
    </ItemGroup>
    
  • 调整实体类结构:将嵌套的fake类移到顶级命名空间下,AOT对嵌套类型的反射支持有限;同时确保属性名称与接口返回字段匹配(若接口返回驼峰格式userId,可给属性添加[DataMember(Name="userid")]特性)。
  • 优化异步调用:避免使用results.Result阻塞线程,直接用await获取结果:
    var results = await client.GetAsync<List<Fake>>("posts");
    Console.WriteLine($"got {results.Count}");
    

完成以上调整后,重新发布AOT版本即可正常运行。


内容的提问来源于stack exchange,提问作者Jan Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 10:05:05