.NET 7 MAUI не получает HTTP-ответ

Я играю с .NET MAUI, и у меня возникла проблема. Я вызываю конечную точку API для отдыха, и она вызывается, ошибок нет (работает на 100%, потому что я получил ответ в Postman и в SwaggerUI). Но мой клиент мобильного приложения никогда не получает ответа. Я, наверное, что-то упускаю. Любая идея приветствуется.

          namespace Mobile.UI.Clients;

    public abstract class BaseClient
    {
        private readonly HttpClient httpClient;
        private readonly MobileAppSettings settings;
    
        private string BaseURL
        {
            get
            {
                return DeviceInfo.Platform == DevicePlatform.Android ?
                                              this.settings.AndroidBaseURL : 
                                              this.settings.IosBaseURL;
            }
        }
    
        protected BaseClient(HttpClient httpClient, MobileAppSettings settings)
        {
            this.settings = settings;
    
            this.httpClient = BuildHttpClient(httpClient);
        }
    
        /// <summary>
        /// Creates a simple get request
        /// </summary>
        /// <typeparam name="T">The return type</typeparam>
        /// <param name="route">The route part without the base url</param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        protected async Task<T> SendGetRequestAsync<T>(string route)
        {
            try
            {
                var uri = BuildUri(route);
    
                var response = await httpClient.GetAsync(uri);
    
                if (!response.IsSuccessStatusCode)
                {
                    throw new Exception("Faild to fetch data.");
                }
    
                var content = await SerializeResponse<T>(response.Content);
                return content;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    
        /// <summary>
        /// Creates a simple get request
        /// </summary>
        /// <typeparam name="T">The return type</typeparam>
        /// <param name="route">The route part without the base url</param>
        /// <param name="routParam">Rout parameter</param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        protected async Task<T> SendGetRequestAsync<T>(string route, object routParam)
        {
            try
            {
                var uri = BuildUri(route, routParam);
    
                var response = await httpClient.GetAsync(uri);
    
                if (!response.IsSuccessStatusCode)
                {
                    throw new Exception("Faild to fetch data.");
                }
    
                var content = await SerializeResponse<T>(response.Content);
                return content;
    
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    
        private HttpClient BuildHttpClient(HttpClient httpClient)
        {
    #if DEBUG
            var handler = new HttpsClientHandlerService();
            httpClient = new HttpClient(handler.GetPlatformMessageHandler());
    #endif
    
            httpClient.BaseAddress = new Uri(BaseURL);
    
            httpClient.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
            httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate, br");
    
            httpClient.DefaultRequestHeaders.Accept.Clear();
            httpClient.DefaultRequestHeaders.Accept.Add(new("application/json"));
    
            return httpClient;
        }
    
        private Uri BuildUri(string route)
        { 
            return new Uri(Path.Combine(BaseURL, settings.ApiVersion, route));
        }
    
        private Uri BuildUri(string route, object routParam)
        {
            return new Uri(Path.Combine(BaseURL, settings.ApiVersion, route, $"{routParam}"));
        }
    
        private async Task<T> SerializeResponse<T>(HttpContent content)
        {
            var stream = await content.ReadAsStreamAsync();
            return await JsonSerializer.DeserializeAsync<T>(stream);
        }
    }
    
    public class PlayerClient : BaseClient, IPlayerClient
    {
        public PlayerClient(HttpClient httpClient, MobileAppSettings settings) : base(httpClient, settings)
        {}
    
        public async Task<List<PlayerModel>> GetAllAsync()
        {
            var path = @"players/get-all";
            return await SendGetRequestAsync<List<PlayerModel>>(path);
        } 

}

    public class HttpsClientHandlerService : IHttpsClientHandlerService
    {
        public HttpMessageHandler GetPlatformMessageHandler()
        {
    #if ANDROID
                var handler = new Xamarin.Android.Net.AndroidMessageHandler();
                handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
                {
                    if (cert != null && cert.Issuer.Equals("CN=localhost"))
                        return true;
                    return errors == System.Net.Security.SslPolicyErrors.None;
                };
                return handler;
    
    #elif IOS
                var handler = new NSUrlSessionHandler
                {
                    TrustOverrideForUrl = IsHttpsLocalhost
                };
                return handler;
    
    #elif WINDOWS || MACCATALYST
                return null;
    #else
            throw new PlatformNotSupportedException("Only Android, iOS, MacCatalyst, and Windows supported.");
    #endif
        }
    
    #if IOS    
        public bool IsHttpsLocalhost(NSUrlSessionHandler sender, string url, Security.SecTrust trust)
        {
            if (url.StartsWith("https://localhost"))
                return true;
            return false;
        }
    #endif
    }

В обработчике сообщений Android я зафиксировал ошибку (если это ошибка):

System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors | System.Net.Security.SslPolicyErrors.RemoteCertificateNameMismatch

0 ответов

Другие вопросы по тегам