红隼与IIS - 运行时缺少libuv.dll

时间:2017-05-23 19:31:37

标签: c# asp.net asp.net-web-api kestrel-http-server

我们正在设置现有的Web API服务器,以便与现有API一起提供站点。我一直在松散地关注this article

这是我的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();
    }
}

和Startup.cs:

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

当我运行项目时,我收到错误

  

无法加载DLL“libuv”:找不到指定的模块。 (HRESULT异常:0x8007007E)

libuv是Kestrel的依赖。如果我手动将它从packages文件夹复制到bin文件夹,它可以工作。这似乎与GitHub Issue comment有关。现在project.json正在被移开,我怎样才能让它自动复制?

有些人认为它不知道是否使用32位或64位版本的libuv,因为平台在项目属性中设置为Any CPU。我已尝试在解决方案和项目设置中将其设置为x64,问题仍然存在。

如何自动将libuv.dll直接复制到构建目录?

我不考虑在项目中包含该文件(而不是在packages文件夹中)并将其设置为复制到输出目录的真正解决方案,只是一种解决方法。我希望找到解决方案,而不是解决方法。

4 个答案:

答案 0 :(得分:11)

我在迁移项目之前遇到过类似的问题。 Visual Studio可能会因项目不匹配而行为不端。

简单答案:您需要将项目更改为MSBuild / csproj格式。

首先,如果您尝试在解决方案中使用.NET Core,请在Visual Studio中右键单击您的项目,如果您没有看到Edit xxxxxx.csproj,则。可能会出现上述报告的问题。

  

基本上,.NET Core项目模板在编译项目时使用不同的工具。

下面的解决方案是解决几乎所有与尝试以.NET Core为目标但希望使用其他框架库的项目相关的问题的通用方法。到目前为止,没有一个很好的工具可以解决这个问题,所以你将不得不采用手动模式。

让我们开始吧。

解决方案很简单(但有点单调乏味)。

步骤1:使用新的MSBuild / csproj格式创建一个新项目

创建一个新项目,然后选择“.NET Core”。

step1

在几乎所有情况下,您可能都希望避免使用ASP.NET核心Web应用程序模板,但这是为了进行另一次讨论。

第2步:定位正确的框架

右键单击该项目,然后选择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>

选择您要定位的框架,并确保支持该框架(此处为表格) 我在上面的代码段中使用了net452作为示例。您可以找到有关naming here

的更多信息

step2

步骤3.对所有项目重复。

您必须为解决方案中的每个项目执行此操作,以防止Visual Studio意外出现。

关于如何让ASP.NET Core与旧框架配合良好,网上的内容确实不多。希望这会帮助你。我希望我早些时候就自己有这个建议。

答案 1 :(得分:1)

我只是将nuget包安装到我的项目中并重新部署。

Install-Package Libuv -Version 1.10.0

答案 2 :(得分:0)

试试这个 - 它可以解决你的问题:

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();

答案 3 :(得分:0)

写下这些代码:

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);

        }
    }
}

并安装这些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" />

你不能简单地在asp.net/iis托管app管道中使用asp.net核心管道。但是Owin已经整合了这条管道,就像一个魅力。