2017-10-02 16 views
0

Le problème se produit uniquement sur mon ordinateur client. J'ai couru mon application sur 4 machines sans succès de reproduction.Machine client: throw NullReference Exception at Flurl.Http.FlurlClient.ReadResponseCookies

Je voudrais demander aux conseils et aider à déboguer l'exception suivante en utilisant la bibliothèque Flurl:

Ce qui peut provoquer cette exception pour fonctionner uniquement sur la machine spécifique? System.TypeInitializationException: L'initialiseur de type de 'Module.Performance.PriceProviders.YahooClientFactory' a lancé une exception. ---> System.AggregateException: une ou plusieurs erreurs sont survenues. --->System.NullReferenceException: référence d'objet non définie sur une instance d'un objet. à Flurl.Http.FlurlClient.ReadResponseCookies (HttpResponseMessage réponse) à Flurl.Http.FlurlClient.d__28.MoveNext() --- Fin de trace de pile d'exception interne --- à System.Threading.Tasks.Task. ThrowIfExceptional (Boolean includeTaskCanceledExceptions) à System.Threading.Tasks.Task 1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task 1.get_Result() à Module.Performance.PriceProviders.YahooClientFactory..cctor() --- Fin de trace de pile d'exception interne --- au module .Performance.PriceProviders.YahooClientFactory.get_GetYahooClient() at Module.Performance.PriceProviders.YahooFlurlClient.d__9.MoveNext() --- Fin de la trace de la pile de l'emplacement précédent où l'exception a été levée --- à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (tâche de tâche) à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (tâche de tâche) à Module.Performance.PriceProviders.YahooStockPriceProvider.d__0.MoveNext() --- Fin de trace de la pile à partir de l'emplacement précédent où exception a été levée --- à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (tâche de la tâche) à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (tâche de la tâche) à Module.Performance.PriceProviders Le code sous l'exception ressemble à:

YahooClientFactory est un facteur singletone pour optimiser le temps de requête. Factory est souvent appelé par d'autres tâches async (couche supérieure)

public static class YahooClientFactory 
{ 
    public static IFlurlClient GetYahooClient => YahooClientInstance; 
    public static string Crumb { get; } 

    private static readonly IFlurlClient YahooClientInstance; 
    private const string CookieUrl = "https://finance.yahoo.com"; 

    private static string userAgent = "User-Agent"; 
    private static string headerString = 
     "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"; 

    private const string CrumbUrl = "https://query1.finance.yahoo.com/v1/test/getcrumb"; 
    private static int MaxRetryCount = 5; 

    static YahooClientFactory() 
    { 
     YahooClientInstance = new FlurlClient() 
       .WithHeader(userAgent, headerString) 
       .EnableCookies() 
       .WithUrl($"{CookieUrl}?{GetRandomString(8)}"); 

     for (int i = 0; i < MaxRetryCount; i++) 
     { 
      YahooClientInstance 
       .GetAsync(CancellationToken.None) 
       .Result 
       .EnsureSuccessStatusCode(); 

      if (YahooClientInstance.Cookies?.Count > 0) 
      { 
       break; 
      } 
      if (i == MaxRetryCount) 
      { 
       throw new Exception("Reached maximum number of retries when connecting to yahoo client."); 
      } 
      Thread.Sleep(100); 
     } 

     Crumb = YahooClientInstance 
      .WithUrl(CrumbUrl) 
      .GetAsync(CancellationToken.None) 
      .ReceiveString() 
      .Result; 
    } 

    public static string GetRandomString(int length) 
    { 
     const string Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 
     return string.Join("", Enumerable.Range(0, length).Select(i => Chars[new Random().Next(Chars.Length)])); 
    } 
} 

Répondre

1

On dirait que vous avez rencontré un known bug où Flurl tente de lire les cookies après une requête a échoué sans vérifier une réponse nulle. Ceci est corrigé pour Flurl.Http 2.0. Veuillez passer au latest prerelease et rapportez si cela résout votre problème.

+0

Merci de votre aide, je suis encore en train de travailler sur les mises à jour pour m'assurer que c'est résoudre mon problème. Ran dans certains problèmes de liaison d'assemblage (comme toujours). – Patryk

+0

Problème résolu après la mise à niveau vers la version 2.0, Merci pour votre conseil :) – Patryk