System.Text.Json.JsonSerializer 的 Xamarin Refit 类型初始值设定项抛出异常

Xamarin Refit type initializer for System.Text.Json.JsonSerializer threw an exception

我在 Xamarin 表单项目中使用 Refit 6.1.15。我的代码在 Android 上完全按照预期工作,但在 iOS 上,我收到“'System.Text.Json.JsonSerializer' 的类型初始值设定项引发异常”。当我执行 api.

我正在使用 Microsoft.Extensions 作为 DI - 我在 Startup.cs class 中的服务配置如下所示:

    services.AddRefitClient<IAuthorizeApi>()
            .ConfigureHttpClient(c => c.BaseAddress = new Uri(BaseAddress))
            .AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[]
            {
                TimeSpan.FromSeconds(1),
                TimeSpan.FromSeconds(5),
                TimeSpan.FromSeconds(15)
            }));

我的 IAuthorizeAPI 如下所示:

using System;
using System.Threading.Tasks;
using CivicMobile.Models;
namespace CivicMobile.Services
{
public interface IAuthorizeApi

{
    [Post("/v1/DataStage/UserAuthentication/Authenticate?companyCode={queryParms.companyCode}&username={queryParms.username}&password={queryParms.password}&deviceIdentifier={queryParms.deviceIdentifier}")]
    [QueryUriFormat(UriFormat.Unescaped)]
    
    Task<ApiResponse<AuthResponse>> Login(Authorize queryParms);
}

我抛出错误的调用(在我的 ViewModel 中)是:

    var authToken = await _authenticateService.Login(queryParms);

登录的 return 值(包装在 ApiResponse 中)如下所示:

namespace CivicMobile.Models
{
public class AuthResponse
{


    [AliasAs("access_token")]
    public string AccessToken { get; set; }

    [AliasAs("token_type")]
    public string TokenType { get; set; }

    [AliasAs("expires_in")]
    public int ExpiresIn { get; set; }

    [AliasAs("userName")]
    public string Username { get; set; }

    [AliasAs("userIdentifier")]
    public string UserIdentifier { get; set; }

    [AliasAs(".issued")]
    public string IssuedAt { get; set; }

    [AliasAs(".expires")]
    public string ExpiresAt { get; set; }
}

我用 [JsonPropertyName()] 替换了 [AliasAs()] 但结果是一样的。

此错误仅发生在 iOS - 不会发生在 Android。有什么建议吗?

在您的 iOS(.csproj) 中添加以下代码:

<ItemGroup>
    <PackageReference Include="System.Memory" Version="4.5.4">
        <IncludeAssets>none</IncludeAssets>
    </PackageReference>
    <PackageReference Include="System.Buffers" Version="4.5.1">
    < IncludeAssets>none</IncludeAssets>
    </PackageReference>
</ItemGroup>

我对我的 DI 容器进行了改装,问题完全消失了。我的代码根本没有其他更改。我会尝试另一个 DI 系统,因为我更喜欢在此应用程序中使用 DI 并改装。

另一个更新 - 我的 ConfigureServices 方法中有 AddHttpClient 和 AddRefitClient。它实际上是死代码(因为我迁移到 Refit 但从未摆脱死代码)。这导致我的 POST 到 return 一个正确的 ApiResponse 对象,其内容被正确反序列化。回到我一开始的计划 - 感谢您的建议 - 它对另一个问题很有帮助(一个非常大的数据集 returning - 不同 Api)。