web-dev-qa-db-fra.com

Kestrel avec IIS - libuv.dll manquant à l'exécution

Nous mettons en place un serveur API Web existant pour desservir le (s) site (s) avec une API existante. J'ai suivi vaguement cet article .

Voici à quoi ressemble mon fichier Global.asax.cs:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        AutoMapperConfig.RegisterMappings();

        var Host = new WebHostBuilder()
           .UseKestrel()
           .UseWebRoot("wwwroot")
           .UseIISIntegration()
           .UseStartup<Startup>()
           .Build();

        Host.Run();
    }
}

et Startup.cs:

public partial class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.UseDefaultFiles();
        app.UseStaticFiles();
    }
}

Quand je lance le projet, j'obtiens l'erreur

Impossible de charger DLL 'libuv': le module spécifié est introuvable. (Exception de HRESULT: 0x8007007E)

libuv est une dépendance de Kestrel. Si je le copie manuellement du dossier packages dans le dossier bin, cela fonctionne. Cela semble avoir du sens avec ce commentaire de GitHub Issue }. Maintenant que project.json est éloigné, comment puis-je le copier automatiquement?

Certains ont postulé qu’il ne savait pas s’il fallait utiliser une version 32 ou 64 bits de libuv car la plate-forme est définie sur N'importe quel processeur dans les propriétés du projet. J'ai essayé de le définir sur x64 dans les paramètres de solution et de projet et le problème persiste.

Comment faire pour que libuv.dll soit copié directement dans le répertoire de construction automatiquement?

Je n'envisage pas d'inclure le fichier dans le projet (plutôt que dans le dossier des packages) et de le configurer pour copier dans le répertoire de sortie une solution réelle, mais uniquement une solution de contournement. J'espère trouver une solution, pas une solution de contournement.

17
Scott H

J'ai déjà eu un problème similaire lors de la migration de projets. Il est possible que Visual Studio se comporte mal avec des projets incompatibles.

Réponse simple: Vous devez modifier vos projets au format MSBuild/csproj.

Pour commencer, si vous essayez d'utiliser .NET Core dans votre solution, cliquez avec le bouton droit de la souris sur votre ou vos projets dans Visual Studio et si vous ne voyez pas Edit xxxxxx.csproj, vous aurez probablement des problèmes. comme celui que vous signalez ci-dessus.

Fondamentalement, les modèles de projet .NET Core utilisent des outils différents lors de la compilation du projet.

La solution ci-dessous est un moyen générique de résoudre presque tous les problèmes liés aux projets qui tentent de cibler .NET Core, mais souhaitent utiliser des bibliothèques d'un autre framework. Il n’existe pas (jusqu’à présent) de bon outil pour résoudre ce problème. Vous devrez donc passer en mode manuel.


Commençons.

La solution est assez simple (mais c'est un peu fastidieux).

Étape 1: Créer un nouveau projet en utilisant le nouveau format MSBuild/csproj

Créez un nouveau projet et sélectionnez ".NET Core".

 step1

Dans presque tous les cas, vous voudrez probablement éviter d'utiliser le modèle d'application Web ASP.NET Core, mais c'est pour une autre discussion en même temps.

Étape 2: Ciblez le bon cadre

Cliquez avec le bouton droit sur le projet et sélectionnez Edit xxxxxx.csproj

<PropertyGroup>
    <TargetFramework>net452</TargetFramework>
    <!--you will also probably want to note that you need these for a console app -->
    <OutputType>Exe</OutputType>
    <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
</PropertyGroup>

Choisissez un framework que vous souhaitez cibler et assurez-vous qu'il est pris en charge (voici un tableau).
J'ai utilisé net452 dans l'extrait de code ci-dessus à titre d'exemple. Vous pouvez en savoir plus sur le nommer ici .

 step2

Étape 3. Répétez l'opération pour tous les projets.

Vous allez devoir faire cela pour chaque projet de votre solution pour empêcher Visual Studio de se comporter de manière inattendue.

Il n’existe vraiment pas beaucoup d’informations en ligne sur la manière de faire en sorte que ASP.NET Core fonctionne correctement avec les anciens frameworks. J'espère que cela vous aidera. Je souhaite avoir ce conseil plus tôt sur moi-même.

11
Svek

Je viens d'installer le paquet Nuget dans mon projet et de le redéployer.

Paquet d'installation Libuv -Version 1.10.0

1
kepung

Essayez ceci - cela pourrait résoudre votre problème:

var Host = new WebHostBuilder()
            .UseKestrel()
            // .UseWebRoot("wwwroot") keep it if you need it
            .UseContentRoot(Directory.GetCurrentDirectory()) // this could solve your problem
            // .UseUrls("http://0.0.0.0:5000") use this if you're using nginx
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();
0
Mafii

Écrivez ces codes:

using Microsoft.Owin;
using Owin;
using System.Web.Http;

[Assembly: OwinStartup(typeof(WebApiAndStaticFiles.OwinStartup))]

namespace WebApiAndStaticFiles
{
    public class OwinStartup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseDefaultFiles();
            app.UseStaticFiles();

            HttpConfiguration webApiConfiguration = new HttpConfiguration();
            GlobalConfiguration.Configure(webApiConfiguration); // Instead of GlobalConfiguration.Configure(WebApiConfig.Register);
            app.UseWebApi(webApiConfiguration);

        }
    }
}

et installez ces paquets de nuget:

<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net462" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net462" />
  <package id="Microsoft.AspNet.WebApi.Owin" version="5.2.3" targetFramework="net462" />
  <package id="Microsoft.Owin" version="3.1.0" targetFramework="net462" />
  <package id="Microsoft.Owin.FileSystems" version="3.1.0" targetFramework="net462" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="3.1.0" targetFramework="net462" />
  <package id="Microsoft.Owin.StaticFiles" version="3.1.0" targetFramework="net462" />
  <package id="Newtonsoft.Json" version="10.0.2" targetFramework="net462" />
  <package id="Owin" version="1.0" targetFramework="net462" />

Vous ne pouvez pas simplement utiliser les pipelines de base asp.net dans le pipeline d'applications hébergées asp.net/iis. Mais Owin a une intégration pour ce pipeline qui fonctionne à merveille.

0
Yaser Moradi