Подтвердить что ты не робот

Пустельга с IIS - libuv.dll отсутствует при запуске

Мы создаем существующий сервер веб-API для обслуживания сайтов (-ов) наряду с существующим API. Я слабо придерживаюсь этой статьи.

Вот что выглядит мой 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 - это зависимость пустельги. Если я вручную скопирую его из папки пакетов в папку bin, он будет работать. Это, похоже, имеет смысл с этим комментарием GitHub. Теперь, когда project.json удаляется, как я могу его скопировать автоматически?

Некоторые полагают, что он не знает, следует ли использовать 32 или 64-битную версию libuv, потому что платформа имеет значение Any CPU в свойствах проекта. Я попытался установить его на x64 в настройках решения и проекта, и проблема не устранена.

Как я могу автоматически копировать libuv.dll прямо в каталог сборки?

Я не рассматриваю включение файла в проект (а не в папку с пакетами) и установку его для копирования в выходной каталог реального решения, только обходным путем. Я надеюсь найти решение, а не обходное решение.

4b9b3361

Ответ 1

У меня была аналогичная проблема перед миграцией проектов. Visual Studio может плохо работать с несогласованными проектами.

Простой ответ: вам нужно изменить свои проекты в формате MSBuild/csproj.

Для начала, если вы пытаетесь использовать .NET Core в своем решении, щелкните правой кнопкой мыши свой проект в Visual Studio и , если вы не видите Edit xxxxxx.csproj, тогда вы вероятно, будут иметь проблемы, подобные тем, о которых вы сообщаете выше.

В принципе, в проектах проекта .NET Core используются различные инструменты при компиляции проекта.

Ниже приведен общий способ решения практически всех проблем, связанных с проектами, нацеленными на .NET Core, но желающих использовать библиотеки из другой структуры. Пока нет хорошего инструмента для преодоления этой проблемы, поэтому вам придется идти в ручном режиме.


Пусть начнется.

Решение довольно просто (но это немного утомительно).

Шаг 1. Создайте новый проект, используя новый формат MSBuild/csproj

Создайте новый проект и выберите ".NET Core".

step1

Почти во всех случаях вы, вероятно, хотите избежать использования шаблона основного веб-приложения ASP.NET, но для другого обсуждения все вместе.

Шаг 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 в приведенном выше фрагменте кода для примера. Вы можете узнать больше о здесь именовании.

step2

Шаг 3. Повторите для всех проектов.

Вам нужно будет сделать это для каждого проекта в своем решении, чтобы Visual Studio не вела себя неожиданно.

На самом деле не так много информации о том, как заставить ASP.NET Core хорошо работать со старыми фреймворками. Надеюсь, это поможет вам. Хотелось бы, чтобы у меня был этот совет раньше на себя.

Ответ 2

Попробуйте это - он может решить вашу проблему:

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

Введите следующие коды:

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 внутри конвейера приложений asp.net/iis. Но у Owin есть интеграция для этого конвейера, который работает как шарм.