Xamarin iOS System.FormatException: входная строка имеет неправильный формат - PullRequest
0 голосов
/ 07 мая 2020

Я столкнулся со странной проблемой в 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);

1 Ответ

0 голосов
/ 21 мая 2020

Наконец обнаружил root причину проблемы. На самом деле он обращается к серверу API, но выдает исключение перед тем, как покинуть мобильный телефон, потому что у пользователя есть VPN в сети Wi-Fi. Переход на использование 4G вместо Wi-Fi решает проблему.

Проблема String.Format возникает из-за того, что код обработки исключений неправильно использует string.Format. Это позволяет скрыть фактическую проблему за счет исключения string.format.

2 изученных элемента:

  • Всегда сначала проверяйте, решает ли проблема использование другой сети
  • Правильная обработка исключения
...