Я столкнулся со странной проблемой в iOS 13.3 и 13.4, которая имеет System.FormatException только для некоторых пользователей. Приложение разработано с использованием Xamarin Forms. Ошибка возникает после вызова серверного API для получения профиля пользователя, но до достижения серверного API (проверено, не достигнув, потому что журналы трассировки AppInsights не показывают вызов).
Я проверил места, где могла произойти ошибка но понятия не имею.
Трассировка стека исключений, записанная в AppCenter
System.FormatException: Input string was not in a correct format.
System.Text StringBuilder.FormatError ()
System.Text StringBuilder.AppendFormatHelper (System.IFormatProvider provider, System.String format, System.ParamsArray args)
System String.FormatHelper (System.IFormatProvider provider, System.String format, System.ParamsArray args)
System String.Format (System.String format, System.Object[] args)
Mobile.Services ApiService.GetAsync[T] (Wipro.MyBAT.Mobile.Core.Logging.AnalyticsEvent analyticsEvent, System.String endPoint, System.String queryString, System.Boolean requiresAuthentication, System.Threading.CancellationToken cancelToken, System.Boolean withRetry)
Mobile.Services ApiService.GetUserProfile ()
Mobile.Services.Users UserService.GetUserProfileFromServer ()
Метод получения профиля пользователя
public async Task<Response<Common.Model.User>> GetUserProfile()
{
var result = await GetAsync<Response<Common.Model.User>>(AnalyticsEvent.UserProfilePerformance, Endpoints.PROFILE).ConfigureAwait(false);
return result;
}
Получить Метод профиля пользователя
private async Task<T> GetAsync<T>(AnalyticsEvent analyticsEvent, string endPoint, string queryString = "", bool requiresAuthentication = true, CancellationToken cancelToken = default, bool withRetry = true)
where T : new()
{
Stopwatch stopwatch = new Stopwatch();
var dict = new Dictionary<string, string>
{
{ "Throttler count", _throttler.CurrentCount.ToString() },
{ "Throttler limit", THROTTLER_LIMIT.ToString() },
{ "Retry", (!withRetry).ToString() }
};
await _throttler.WaitAsync();
stopwatch.Start();
string callId = System.Guid.NewGuid().ToString();
string url;
string responseString = string.Empty;
try
{
if (_connectivity.NetworkAccess == Xamarin.Essentials.NetworkAccess.None || _connectivity.NetworkAccess == Xamarin.Essentials.NetworkAccess.Unknown)
{
return default(T);
}
url = $"{_environment.HostUrl}/api/{endPoint}{queryString}";
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, url);
if (requiresAuthentication)
{
var token = await _authService.GetAccessToken();
message.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("bearer", token);
message.Headers.Add("callid", callId);
}
// Error should be before this line as the call it not reaching API side
HttpResponseMessage response = await _httpClient.SendAsync(message, cancelToken);