Xamarin async Http-клиент

У меня проблема в моем проекте Xamarin: когда я пытаюсь получить JsonString с веб-страницы, через HttpClient.GetStringAsncy мое приложение вылетает. Вот StackTrace ошибки:

  at System.Net.Http.HttpClientHandler+d__63.MoveNext () [0x00479] in :0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in :0 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x0003e] in :0 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x00028] in :0 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x00008] in :0 
  at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult () [0x00000] in :0 
  at System.Net.Http.HttpClient+d__49.MoveNext () [0x000ca] in :0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in :0 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x0003e] in :0 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x00028] in :0 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x00008] in :0 
  at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult () [0x00000] in :0 
  at System.Net.Http.HttpClient+d__54.MoveNext () [0x0007d] in :0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in :0 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x0003e] in :0 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x00028] in :0 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x00008] in :0 
  at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult () [0x00000] in :0 
  at MRKrauchthal.Pages.GameDetailPage+d__13.MoveNext () [0x00057] in E:\Visual Studio Projects\MRKrauchthal\MRKrauchthal\MRKrauchthal\Pages\GameDetailPage.xaml.cs:99 

e.InnerException

{System.Net.WebException: Error: SecureChannelFailure (The authentication or decryption has failed.) ---> System.IO.IOException: The authentication or decryption has failed. ---> System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: The authentication or decryption has failed.
  at Mono.Security.Protocol.Tls.RecordProtocol.EndReceiveRecord (System.IAsyncResult asyncResult) [0x00037] in :0 
  at Mono.Security.Protocol.Tls.SslClientStream.SafeEndReceiveRecord (System.IAsyncResult ar, System.Boolean ignoreEmpty) [0x00000] in :0 
  at Mono.Security.Protocol.Tls.SslClientStream.NegotiateAsyncWorker (System.IAsyncResult result) [0x00071] in :0 
   --- End of inner exception stack trace ---
  at Mono.Security.Protocol.Tls.SslClientStream.EndNegotiateHandshake (System.IAsyncResult result) [0x00032] in :0 
  at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (System.IAsyncResult asyncResult) [0x0000c] in :0 
   --- End of inner exception stack trace ---
  at Mono.Security.Protocol.Tls.SslStreamBase.EndRead (System.IAsyncResult asyncResult) [0x0004b] in :0 
  at Mono.Net.Security.Private.LegacySslStream.EndAuthenticateAsClient (System.IAsyncResult asyncResult) [0x0000e] in :0 
  at Mono.Net.Security.Private.LegacySslStream.AuthenticateAsClient (System.String targetHost, System.Security.Cryptography.X509Certificates.X509CertificateCollection clientCertificates, System.Security.Authentication.SslProtocols enabledSslProtocols, System.Boolean checkCertificateRevocation) [0x0000e] in :0 
  at Mono.Net.Security.MonoTlsStream.CreateStream (System.Byte[] buffer) [0x0007b] in :0 
  at System.Net.WebConnection.CreateStream (System.Net.HttpWebRequest request) [0x00073] in :0 
   --- End of inner exception stack trace ---
  at System.Net.HttpWebRequest.EndGetResponse (System.IAsyncResult asyncResult) [0x00058] in :0 
  at System.Threading.Tasks.TaskFactory`1[TResult].FromAsyncCoreLogic (System.IAsyncResult iar, System.Func`2[T,TResult] endFunction, System.Action`1[T] endAction, System.Threading.Tasks.Task`1[TResult] promise, System.Boolean requiresSynchronization) [0x0000f] in :0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in :0 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x0003e] in :0 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x00028] in :0 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x00008] in :0 
  at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1+ConfiguredTaskAwaiter[TResult].GetResult () [0x00000] in :0 
  at System.Net.Http.HttpClientHandler+d__63.MoveNext () [0x0041e] in :0 }

Код выглядит так:

private async Task SetImage(int id, string teamName, Xamarin.Forms.Image image)
    {
        try
        {
            HttpClient httpClient = new HttpClient();
            obj = JsonConvert.DeserializeObject<JsonImage>(await httpClient.GetStringAsync("www.linkToImage.com").ConfigureAwait(false));
        }
        catch (Exception e) {
            test.Text = e.StackTrace;
        }

    }

Надеюсь, мне кто-нибудь поможет: D

С уважением


person Juan Wayne    schedule 11.07.2017    source источник
comment
Вы печатаете трассировку стека, но не сообщение об ошибке. Пожалуйста, добавьте эту информацию, так как это, вероятно, ключ к решению проблемы.   -  person Claudio Redi    schedule 11.07.2017
comment
Что произойдет, если ваш GET вернет ошибку? Вы не проверяете, успешен ли результат, прежде чем пытаться десериализовать. То, что вы можете написать это в одной строке, не означает, что вы должны.   -  person maccettura    schedule 11.07.2017
comment
Сообщение об ошибке, которое я получаю с e.message: Произошла ошибка при отправке запроса.   -  person Juan Wayne    schedule 11.07.2017
comment
Когда я пытаюсь использовать ссылку самостоятельно, скопировав и вставив ссылку в моем браузере, я получаю полный ответ json.   -  person Juan Wayne    schedule 11.07.2017
comment
Вызванное исключение, скорее всего, AggregateException. Это свойство InnerExceptions содержит реальные исключения, которые были выброшены. Не могли бы вы поделиться ими, пожалуйста?   -  person NtFreX    schedule 11.07.2017
comment
@NtFreX Я добавил внутреннее исключение к своему вопросу.   -  person Juan Wayne    schedule 11.07.2017
comment
Попробуйте изменить свой URL на https://www.linkToImage.com. Может это поможет   -  person NtFreX    schedule 11.07.2017
comment
@NtFreX URL-адрес уже начинается с https - ›исходная ссылка: api-v2.swissunihockey.ch / api / team / 428351   -  person Juan Wayne    schedule 11.07.2017
comment
Я имею в виду строку, которую вы используете в методе GetStringAsync.   -  person NtFreX    schedule 11.07.2017
comment
@NtFreX строка: "https://api-v2.swissunihockey.ch/api/teams/428351"   -  person Juan Wayne    schedule 11.07.2017


Ответы (1)


Существует некоторая проблема с реализацией SSL / TLS по умолчанию в Xamarin.Android. Вы можете перейти в Android Настройки проекта-> Параметры Android-> Дополнительно-> Реализация SSL / TLS и перейти на Собственный TLS 1.2+  введите описание изображения здесь < / а>

person lowleetak    schedule 11.07.2017