gpt4 book ai didi

c# - 将 ASP.Net Core 2 (.NET Framework) Web Api 拆分为类库和托管项目是否可能/明智?

转载 作者:太空狗 更新时间:2023-10-29 20:41:00 27 4
gpt4 key购买 nike

我正在尝试使用 Visual Studio 2017 (v15.4.5) 将现有的 WCF Web API(针对 .NET Framework 4.6.1)移植到 ASP.Net Core 2,但在找出组织项目的好/常见/支持方法时遇到了麻烦,以及它们应该是什么类型的项目。

例如:

  • 服务器和托管的单个项目,用于托管的服务器和控制台应用程序的类库
  • 控制台应用程序的 Windows 经典桌面项目和(新样式 csproj)服务器库的 Web 应用程序,两个 Web 应用程序(一个输出类库,另一个输出控制台应用程序)

  • 我偷偷地怀疑我遗漏了一些基本的东西,这意味着一种方法应该优于其他方法,甚至是强制性的,但我发现很难从 ASP.Net Core 2 documentation 中发现这一点。 .

    具体要求
  • 应面向 .NET Framework 4.6.1
    由于我需要从 Web API 的内部访问 Windows 注册表,因此我的目标是 .NET Framework 4.6.1 而不是 .NET Core。
  • 使用 HTTP.sys 的主机
    我打算将来使用 Windows 身份验证,并且相信 Kestrel 不会支持(基于 HTTP.sys features)。
  • 主机应作为 Windows 服务运行
    最终,Web API 应该由 Windows Installer 安装并作为服务运行。
    目前,我只是想让 API 独立地构建/正常工作,但也希望了解项目选择可能如何影响发布/部署。

  • 首选方案

    虽然默认情况下,新的 ASP.NET Core 2 Web 应用程序是输出控制台应用程序的单个项目,但我更愿意将解决方案拆分为 2 个主要项目:
  • “服务器”- ASP.NET Core 2(.NET 框架)类库包含 Web API、 Controller 和启动类的业务逻辑
  • “主机” - 引用“服务器”并负责托管 Web API 的控制台应用程序

  • 这种安排对我来说似乎很合适,因为任何单元/集成测试项目都可以引用“服务器”类库,而不是可执行文件(根据 Is it a bad practice to reference an exe file in C# project 中的建议)。

    此外,我相信这是合理的,因为我可以在项目属性中将输出类型更改为“类库”。

    我假设因为我的目标是 .Net Framework,所以只要我安装与“服务器”项目相同的 NuGet 包,“主机”项目就没有理由不能成为 Windows 经典桌面控制台应用程序。

    是否有任何隐藏的问题,可能与发布/部署有关,使这种安排成为一个坏主意?
    将托管项目设为 Web 应用程序(仍将引用服务器项目)是否有任何优势?

    试图

    以下是我用来尝试实现我喜欢的项目组织的步骤。虽然它有效,但我在构建过程中收到警告 - 见下文。

    服务器
  • 添加新项目“服务器”
  • 选择 Visual C#、Web、ASP.NET Core Web 应用程序

    在下面的对话框中,定位到 .NET Framework、ASP.NET Core 2.0,然后选择 Web API
  • 将项目属性中的输出类型更改为“类库”
  • 删除 Program.cs

  • 主持人
  • 添加新项目“主机”
  • 选择 Visual C#、Windows 经典桌面、控制台应用程序 (.NET Framework)
  • 将 Program.cs 的内容替换为:
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Logging;
    using Server;

    namespace Host
    {
    internal class Program
    {
    private static void Main(string[] args)
    {
    BuildWebHost(args).Run();
    }

    private static IWebHost BuildWebHost(string[] args) =>
    new WebHostBuilder()
    .UseStartup<Startup>()
    .UseHttpSys(options =>
    {
    options.UrlPrefixes.Add("http://localhost:8080/");
    })
    .ConfigureLogging((hostingContext, logging) =>
    {
    logging.AddConsole();
    logging.AddDebug();
    })
    .Build();
    }
    }
  • 添加对服务器项目的引用
  • 安装这些 NuGet 包
  • Microsoft.AspNetCore (2.0.1)
  • Microsoft.AspNetCore.Mvc (2.0.1)
  • Microsoft.AspNetCore.Server.HttpSys (2.0.2)
  • 设为启动项目

  • 问题:构建生成警告

    此解决方案在调试下运行,并正确响应 http://localhost:8080/api/valueshttp://localhost:8080/api/values/1 , 但是 构建解决方案后会显示以下警告:
    Warning     The referenced component 'System.Security.Cryptography.Encoding' could not be found.    Host            
    Warning The referenced component 'System.Xml.XPath' could not be found. Host
    Warning The referenced component 'System.IO.FileSystem.Primitives' could not be found. Host
    Warning The referenced component 'System.IO.FileSystem' could not be found. Host
    Warning The referenced component 'System.Diagnostics.StackTrace' could not be found. Host
    Warning The referenced component 'System.Xml.XmlDocument' could not be found. Host
    Warning The referenced component 'System.Security.Cryptography.X509Certificates' could not be found. Host
    Warning The referenced component 'System.Diagnostics.FileVersionInfo' could not be found. Host
    Warning The referenced component 'System.Security.Cryptography.Algorithms' could not be found. Host
    Warning The referenced component 'System.Xml.ReaderWriter' could not be found. Host
    Warning The referenced component 'System.Security.Cryptography.Primitives' could not be found. Host
    Warning The referenced component 'System.ValueTuple' could not be found. Host
    Warning The referenced component 'System.Xml.XPath.XDocument' could not be found. Host
    Warning The referenced component 'System.IO.Compression' could not be found. Host
    Warning The referenced component 'System.AppContext' could not be found. Host
    Warning The referenced component 'System.Threading.Thread' could not be found. Host
    Warning The referenced component 'System.Console' could not be found. Host

    如果这是一个合理的项目安排,为什么我会收到这些警告?

    最佳答案

    我们正在做类似的事情。我们的宿主是一个 .NET Framework 4.7.1 项目:

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

    <PropertyGroup>
    <TargetFramework>net471</TargetFramework>
    <IsPackable>true</IsPackable>
    <PlatformTarget>x86</PlatformTarget>
    <OutputType>Exe</OutputType>
    </PropertyGroup>

    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <Prefer32Bit>false</Prefer32Bit>
    </PropertyGroup>

    <ItemGroup>
    <Folder Include="wwwroot\" />
    </ItemGroup>

    <ItemGroup>
    <PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.6" />
    <PackageReference Include="Microsoft.AspNetCore" Version="2.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.0" />
    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.1.0" />
    <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="2.1.0" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.0" />
    </ItemGroup>

    <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
    </ItemGroup>

    <ItemGroup>
    <ProjectReference Include="..\Business.csproj" />
    <ProjectReference Include="..\Apis.Shared.csproj" />
    <ProjectReference Include="..\Apis.Contracts.csproj" />
    </ItemGroup>

    </Project>

    我们的库项目是 NetStandard2.0:
    <Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>

    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>full</DebugType>
    <DebugSymbols>true</DebugSymbols>
    </PropertyGroup>

    </Project>

    Program.cs 看起来像这样:
    public class Program
    {
    public static void Main(string[] args)
    {
    var host = new WebHostBuilder()
    .UseKestrel()
    .ConfigureServices(services => services.AddAutofac())
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseIISIntegration()
    .UseStartup<Startup>()
    .Build();

    host.Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .Build();
    }

    Startup.cs 看起来像这样:
    public class Startup
    {
    public Startup(IHostingEnvironment hostingEnvironment)
    {
    Settings = new AppSettings(hostingEnvironment);
    }

    public AppSettings Settings { get; private set; }

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
    services.AddMvc();
    services.AddOptions();
    // any other services registrations...

    var builder = new ContainerBuilder();
    // all autofac registrations...
    builder.Populate(services);

    return new AutofacServiceProvider(builder.Build(););
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
    if (env.IsDevelopment())
    {
    app.UseDeveloperExceptionPage();
    }

    app.UseMvc();
    }
    }

    关于c# - 将 ASP.Net Core 2 (.NET Framework) Web Api 拆分为类库和托管项目是否可能/明智?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47595244/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com