Пустельга с 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 прямо в каталог сборки?
Я не рассматриваю включение файла в проект (а не в папку с пакетами) и установку его для копирования в выходной каталог реального решения, только обходным путем. Я надеюсь найти решение, а не обходное решение.
Ответы
Ответ 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 есть интеграция для этого конвейера, который работает как шарм.