Xamarin: java.security.cert.CertPathValidatorException: доверенная привязка для пути сертификации не найдена - PullRequest
0 голосов
/ 14 октября 2019

В Ксамарине. Я пытался установить связь между моим Web API и моим проектом Xamarin. Вот код моего контроллера:

//  GET api/values
    public List<string> Get()
    {
        List<string> values = new List<string>();
        values.Add("Value 1");
        values.Add("Value 2");
        return values;
    }

А вот мой запрос GET в моем MainPage.xaml.cs

    public async void BindToListView()
    {
        HttpClient client = new HttpClient();
        var response = await client.GetStringAsync("https://10.0.2.2:#####/api/Values");
        var posts = JsonConvert.DeserializeObject<List<Posts>>(response);
        lv.ItemsSource = posts;
    }

Всякий раз, когда я пытаюсь запустить обамое приложение для Android и приложение для веб-API. Я продолжаю получать это исключение:

    Javax.Net.Ssl.SSLHandshakeException: 
'java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.'

Я пытался вставить это в мой MainActivity.cs , но оно все еще не работает.

ServicePointManager.ServerCertificateValidationCallback += (o, cert, chain, errors) => true;

У меня эта проблема уже несколько месяцев, и она сводит меня с ума. Я что-то пропустил? Я довольно новичок в разработке приложений Xamarin, и я не могу решить эту проблему.

Будем весьма благодарны за любые предложения о том, как решить эту проблему. Спасибо, что нашли время, чтобы прочитать это.

1 Ответ

0 голосов
/ 14 октября 2019

Для Android вы должны сделать что-то большее.

в Forms, создать интерфейс

public interface IHTTPClientHandlerCreationService
{
  HttpClientHandler GetInsecureHandler();
}

, в Android реализован интерфейс:

[assembly: Dependency(typeof(HTTPClientHandlerCreationService_Android))]
namespace xxx.Droid
{
  public class HTTPClientHandlerCreationService_Android : CollateralUploader.Services.IHTTPClientHandlerCreationService
  {
    public HttpClientHandler GetInsecureHandler()
    {
      return new IgnoreSSLClientHandler();
    }
  }

  internal class IgnoreSSLClientHandler : AndroidClientHandler
  {
    protected override SSLSocketFactory ConfigureCustomSSLSocketFactory(HttpsURLConnection connection)
    {
      return SSLCertificateSocketFactory.GetInsecure(1000, null);
    }

    protected override IHostnameVerifier GetSSLHostnameVerifier(HttpsURLConnection connection)
    {
      return new IgnoreSSLHostnameVerifier();
    }
  }

  internal class IgnoreSSLHostnameVerifier : Java.Lang.Object, IHostnameVerifier
  {
    public bool Verify(string hostname, ISSLSession session)
    {
      return true;
    }
  }
}

А когда вывызовите метод Get

public async void BindToListView()
{
  HttpClient client;

  switch (Device.RuntimePlatform)
  {
    case Device.Android:
      this.httpClient = new HttpClient(DependencyService.Get<Services.IHTTPClientHandlerCreationService>().GetInsecureHandler());
      break;
    default:
      ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
      this.httpClient = new HttpClient(new HttpClientHandler());
      break;
  }

  var response = await client.GetStringAsync("https://10.0.2.2:#####/api/Values");
  var posts = JsonConvert.DeserializeObject<ObservableCollection<Posts>>(response);
  lv.ItemsSource = posts;
}

Кроме того, я предлагаю использовать ObservableCollection вместо List, поскольку в нем реализован интерфейс INotifyPropertyChanged . В противном случае пользовательский интерфейс никогда не будет обновлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...