同一解决方案中的 ASP.NET Core 5 MVC/RazorPages 和 WebAPI 项目

问题描述 投票:0回答:3

许多站点被分成两部分:

  • www.example.com
    :面向访客的公共 MVC / RazorPages 服务器渲染应用程序
  • app.example.com
    :供客户和管理员使用的私有 WebAPI 应用程序(可通过 SPA 访问)

这两个应用程序有很多共享的东西,例如代码、数据库、样式,因此最好将它们放在一个解决方案中,也可能分成多个项目。我希望可以通过某种方式调整标准配置来做到这一点(例如

Startup.cs
)。

文档不涵盖这种情况。这个问题有多种解决方案,但它们适用于框架的旧版本

ASP.NET Core 5 是如何做到这一点的?

asp.net-core asp.net-core-mvc asp.net-core-webapi razor-pages asp.net-core-5.0
3个回答
4
投票

我想说,您可以通过不同的方式来做到这一点,具体取决于您的需求以及您想要如何设计解决方案的架构、测试、部署过程等。


一次申请

以一种简单的方式,您可以在同一个 Web 项目中公开 Web API 和带有前端的应用程序。 然后,例如,通过映射控制器,您可以指定哪个是哪个。

  • API控制器支架示例:
[ApiController]
[Area("api")]
[Route("[area]/[controller]")]
public class ResourceController : ControllerBase
{
    ...
}
  • WebApp 控制器支架示例:
public class FeatureController : Controller
{
    ...
}

(请注意,MVC 控制器需要

Controller
基类。对于 API 控制器,
ControllerBase
就足够了。)

对于应用程序的

Startup
,在控制器和路由之间执行默认映射可能就足够了:

app.UseEndpoints(endpoint =>
{
    endpoint.MapDefaultControllerRoute();
});

通过这种方法,您甚至可以根据路线映射不同的中间件类:

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
   {
       appBuilder.UseMiddleware<ApiRelatedMiddleware>();
   })
   .UseWhen(context => !context.Request.Path.StartsWithSegments("/api"), appBuilder =>
   {
       appBuilder.UseMiddleware<FrontEndRelatedMiddleware>();
   });

至于应用的其他需求,您可以注册您需要的服务。


单独的应用程序:

但是,这种“简单”方法可能会给您的应用程序带来过多的复杂性,因为它只是一个应用程序,但身份验证、授权、日志记录或部署等内容可能有不同的要求。测试也可能有所不同。

此外,还必须确保上游管理每条路线的访问和可见性。

出于这些原因以及为了更易于理解的架构,在大多数情况下,我更愿意拆分项目。

遵循多层方案甚至干净的架构(此处的 Microsoft 文档)将解决大多数问题。

应用程序之间的公共部分自然会位于公共层中,因为它们将链接到业务逻辑或基础设施等。然后,两个 Web 应用程序都可以引用所需的项目。


2
投票

作为其他两个很好的答案的替代方案,您还可以将项目添加为应用程序部分

与文档所述一样,应用程序部件允许您将 ASP.NET 控制器/视图/页面/端点拆分为单独的库,并将它们集中在一个屋檐下。

// MVC.csproj - Startup.cs
public void ConfigureServices(IServiceCollection services)
{
     services.AddControllersWithViews().AddApiControllers();
}

// Api.csproj - StartupExtensions.cs
public static void AddApiControllers(this IMvcBuilder builder)
{
    builder.AddApplicationPart(Assembly.GetExecutingAssembly());
}

1
投票

据我所知,你可以直接在同一个项目中创建Web api控制器和MVC控制器。

因为 Web api 控制器将具有其属性,例如

    [Route("api/[controller]")]
[ApiController]

在asp.net core中,当发生路由映射时,会首先查找属性route,然后在startup.cs中查找端点映射,如下所示:

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=home}/{action=index}/{id?}");

        });
© www.soinside.com 2019 - 2024. All rights reserved.