3
votes

Comment éviter l'exception non gérée System.TypeLoadException dans le navigateur lors du chargement de l'application côté client Blazor

J'ai une application Blazor côté client et lorsque j'essaye de l'exécuter pour le débogage à partir de Visual Studio 2019 16.3.0 Preview 2.0, j'obtiens ce message d'erreur dans le navigateur Chrome (vu lors du débogage à l'aide de Shift-Alt-D ):

blazor.webassembly.js: 1 WASM: System.TypeLoadException: impossible de résoudre le type avec le jeton 01000020 de typeref (classe attendue 'Microsoft.AspNetCore.Blazor.HttpClientJsonExtensions' dans l'assembly 'Microsoft.AspNetCore.Blazor, Version = 0.7.0.0, Culture = neutral, PublicKeyToken = adb9793829ddae60 ')

J'ai défini un point d'arrêt aussi tôt que possible dans Main dans Program.cs, mais cela n'est pas touché.

J'utilise Blazor version 3.0.0-preview8.19405.7. J'ai cherché une solution à ce problème, mais tous les articles semblent aborder d'autres problèmes que le mien.

Le problème semble concerner Json et HttpClient, j'ai donc pensé que cela pourrait avoir quelque chose à voir avec le mise à jour car il a été mentionné dans la procédure: https://devblogs.microsoft.com/aspnet/asp-net-core-and-blazor-updates-in-net-core-3-0-preview-8/

Mais en fait, je n'ai pas utilisé Json avec succès avant la mise à jour (il était en cours de développement), donc je ne sais pas avec certitude si cela a quelque chose à voir avec ça.

Edit: j'ai essayé de supprimer les deux lignes du code (mais gardé la référence à Microsoft.AspNetCore.Blazor.HttpClient dans le fichier projet):

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpClient();
        services.AddTransient<IServiceProxy, ServiceProxy>();
    }
}

et

public class ServiceProxy : IServiceProxy
{
    private readonly HttpClient httpClient;
    public ServiceProxy(IHttpClientFactory httpClientFactory)
    {
        httpClient = httpClientFactory.CreateClient();
        httpClient.BaseAddress = new Uri("https://localhost:12345"), UriKind.Absolute);
    }

    public async Task<bool> GetResultAsync()
    {
        bool result
        try
        {
            result = await httpClient.GetJsonAsync<bool>("resource");
        }
        catch (HttpRequestException httpRequestException)
        {
            throw new ConnectionException(string.Format("Http Request failed: {0}", httpRequestException.Message), httpRequestException);
        }
        return result;
    }
}


9 commentaires

Avez-vous ajouté le package Microsoft.AspNetCore.Blazor.HttpClient et s'agit-il de la bonne version? Consultez le blog de mise à niveau: devblogs.microsoft.com/aspnet/...


Oui, j'ai cette ligne dans mon fichier de projet:


Ok, alors c'est vérifié. Je n'ai aucune idée de ce que cela pourrait être d'autre.


Merci pour l'aide. Je vais devoir faire plus d'investigation pour voir si je peux le faire fonctionner à nouveau et ce qui a fonctionné si je le fais. Je ferai des mises à jour si je me rapproche de la solution.


Juste pour vérifier, utilisez-vous le .net core 3 sdk preview 8?


J'ai vérifié cela en utilisant cette commande: C: \ Users \ Troels> dotnet --list-sdks 2.1.801 [C: \ Program Files \ dotnet \ sdk] 3.0.100-preview6-012264 [C: \ Program Files \ dotnet \ sdk] 3.0.100-preview8-013656 [C: \ Program Files \ dotnet \ sdk] Ensuite, j'ai désinstallé tous les SDK et réinstallé Preview 8: C: \ Users \ Troels> dotnet - list-sdks 3.0.100-preview8-013656 [C: \ Program Files \ dotnet \ sdk] Après cela, j'ai toujours la même erreur.


J'ai maintenant isolé les lignes problématiques, qui n'étaient pas étonnamment liées à l'utilisation des opérations JSON httpClient. Je mettrai à jour le message.


Comment obtenez-vous votre httpClient? Pouvez-vous afficher le @inject ou l'équivalent?


Je modifierai mon message pour inclure la création de httpClient.


3 Réponses :


1
votes

Lorsque je rencontre des problèmes comme celui-ci, je supprime les dossiers bin et obj pendant que mon projet est fermé. Je supprime également tous les paquets nuget et les installe à nouveau.

J'espère que cela vous aidera.


3 commentaires

J'avais fait cela avant et j'ai vérifié deux fois. Cela ne résout pas le problème. Mais merci de l'essayer.


Cela se produit-il lorsque vous créez un nouveau projet Blazor et que vous l'exécutez? Dans le passé, j'ai rencontré des problèmes où je devais créer un nouveau projet pour m'assurer qu'il se compile, puis modifier mon startup.cs, m'assurer qu'il fonctionne, puis je copie mes services et composants de modèles, etc.


J'espérais pouvoir trouver l'erreur sans le faire, mais ce sera probablement le seul moyen. Je peux réellement faire fonctionner le modèle Blazor (pour le client et le serveur), je l'ai vérifié, mais il y a beaucoup de choses là-dedans, je n'en aurai pas besoin. Je prévois de mettre à jour ce message, lorsque j'ai essayé de créer ma propre fonctionnalité par-dessus le modèle, en essayant d'isoler le problème.



0
votes

Le blazor côté client ne prend pas en charge IHttpClientFactory . Le côté client HttpClient n'est pas le même que celui du côté serveur ou d'une autre version. C'est un wrapper de la XMLHttpRequest dans le navigateur. (En plus superposé sur dactylographié)

[Les applications côté client Blazor appellent les API Web à l'aide d'un Service HttpClient. Composer des demandes, qui peuvent inclure JavaScript Récupérez les options de l'API, à l'aide des assistants Blazor JSON ou avec HttpRequestMessage.

Les applications côté serveur Blazor appellent des API Web à l'aide d'instances HttpClient généralement créé à l'aide de IHttpClientFactory. Pour plus d'informations, consultez Effectuez des requêtes HTTP à l'aide de IHttpClientFactory dans ASP.NET Core.] 1

Côté client, le HttpClient est prêt à l'emploi inclus dans la DI. Vous pouvez l'utiliser pour faire des appels http.

Injectez-le dans le code dans le constructeur:

@inject HttpClient MyHttpClient

code {
   //Use the MyHttpClientin other methods as usual
}

Injection dans une propriété

[Inject]
public HttpClient MyHttpClient { get; set; }

Injection dans une page blazor

private readonly HttpClient _httpClient;

public YourClassName(HttpClient httpClient)
{
    _httpClient = httpClient;
}

//Use the _httpClient in other methods as usual

Ressources supplémentaires pour DI dans blazor


3 commentaires

Merci beaucoup pour la réponse. Je suis sûr que c'est nécessaire mais malheureusement pas suffisant. J'ai implémenté l'utilisation du côté client HttpClient inclus dans la DI, mais j'ai toujours exactement la même erreur.


Avez-vous la solution divisée en plusieurs projets? Le cas habituel pour TypeLoadException est que le (s) projet (s) inclus ciblent le mauvais framework. Si tel est le cas, veuillez vérifier si tous les projets référencés ciblent netstandard2.0 .


Ma solution est divisée, mais chaque dépendance cible .NET Standard 2.0 comme vous le suggérez.



2
votes

J'ai mis à niveau mon Visual Studio 2019 vers 16.4.0 Preview 1.0, puis quelque chose s'est cassé, qui ne s'est pas cassé auparavant. Et lors de la consolidation de mes dépendances NuGet, j'ai été très surpris qu'un de mes projets de dépendance .NET Standard ait en fait une référence à Blazor 0.7.0, qui était plus ancienne que la version Preview 8 à partir de laquelle je mettais à niveau.

Cette référence était probablement la cause de ma douleur! Lorsque cette référence a été supprimée, je ne pouvais plus appeler mes httpClient.PutJsonAsync et httpClient.GetJsonAsync, car cela n'est probablement implémenté que dans la version Blazor de HttpClient.

J'ai réécrit ma bibliothèque pour utiliser httpClient.PutAsync et httpClient.GetAsync et utiliser Newtonsoft.Json pour sérialiser et désérialiser. Après avoir corrigé certains problèmes CORS, cela a fonctionné.


0 commentaires