Как разместить ASP.Net Основной сервер в библиотеке классов

#c# #asp.net-core

Вопрос:

У меня есть более старое приложение WinForms, которое было успешно перенесено с .Net 3.5 на .Net 5.

Теперь я хотел бы добавить веб-интерфейс в приложение, используя ASP.Net Ядро. И чтобы сохранить обзор, я хотел бы передать функциональность на аутсорсинг в библиотеку классов.

Поэтому я создал библиотеку классов, и она используется в качестве SDK проекта Microsoft.NET.Sdk . Кроме того, я добавил следующие ссылки в .csproj :

     <ItemGroup>
        <ProjectCapability Include="AspNetCore" />
        <FrameworkReference Include="Microsoft.AspNetCore.App" />
    </ItemGroup>
 

С помощью этого я смог скомпилировать небольшой класс запуска без каких-либо ошибок, так как все ссылки на ASP.Net Ядро, похоже, относится к нему. Однако, когда я пытаюсь запустить его, я получаю System.IO.FileNotFoundException : Could not load file or assembly 'Microsoft.AspNetCore' исключение.
В настоящее время мой код запуска выглядит следующим образом:

 var builder = WebApplication.CreateBuilder();
builder.Services.AddControllersWithViews();
var app = builder.Build();

app.UseDeveloperExceptionPage();
app.UseStaticFiles();
app.UseRouting();

app.MapRazorPages();
app.MapControllers();
app.MapFallbackToFile("index.html");

app.Run();
 

Есть идеи, что я здесь делаю не так? Или мой план вообще невыполним?

Комментарии:

1. Зачем вам нужна дополнительная сложность, которая ASP.NET Ядро приносит?

2. Супер просто для рабочего стола Blazor, github.com/edandersen/blazor-desktop-crossplatform-sample/tree/…

3. Рабочий стол Blazor-это не совсем то, что я ищу. Как я уже сказал, я хочу добавить в приложение функцию, которая с удаленного компьютера через веб-браузер может извлекать определенные данные и вызывать функции. Blazor Desktop использует <Project Sdk=»Microsoft.NET.Sdk.Web»> или Microsoft.NET.Sdk.Razor. Если я использую их в своем проекте, я получаю известное сообщение об ошибке с последним, а с первым я получаю сообщение об ошибке, что в моей библиотеке классов нет статического основного метода

4. Библиотека классов не нуждается в основном методе, потому что это не точка входа.

Ответ №1:

Я бы предложил разделить бизнес-логику на ASP.NET Основной проект веб-API.

Тогда и WinForms, и веб-интерфейс могут просто вызывать один и тот же API.

Ответ №2:

Перенести большую часть вашей логики в classlib — отличная идея.

Веб-приложение.CreateBuilder() должен быть запущен в проекте с пакетом Sdk «Microsoft.NET.Sdk.Web».

Это задано в элементе вашего .csproj.

Я бы рекомендовал перенести как можно больше в classlib и сохранить только то, что нельзя переместить в ASP.NET проект.


Файл .csproj для ASP.NET проект начинается с этого:

 <Project Sdk="Microsoft.NET.Sdk.Web">
 

И файл .csproj classlib начинается с этого:

 <Project Sdk="Microsoft.NET.Sdk">
 

Комментарии:

1. Проблема в том, что я должен использовать Microsoft.NET.Sdk.WindowsDesktop SDK для моего основного приложения, чтобы запустить winforms…