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)。
我在 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)。