从ASP.Net Core Web Api模板中移除MVC Razor依赖项

时间:2022-08-30 22:28:06

前言 :本篇文章,我将会介绍如何在不包括MVC / Razor功能和包的情况下,添加最少的依赖项到ASP.NET Core Web API项目中。

一、MVC   VS WebApi

(1)在ASP.NET的早期版本中,MVC和Web API技术栈是完全分开的。 尽管它们之间共享了许多相似的概念,但实际类型却截然不同。 这通常有点尴尬,当您意外引用错误的命名空间时,通常会导致错误。

(2)在ASP.NET Core中,这不再是个问题:MVC和Web API已统一,其中MVC中的控制器和Web API中的控制器之间基本上没有真正的区别。 您所有的控制器都可以充当MVC控制器,也可以充当Web API控制器,以返回格式化(例如JSON或XML)数据。

(3)话虽如此,如果您只需要使用Web API功能,那么您可能就不需要MVC功能。 但是,当前默认模板中却默认包含了MVC的功能。

二、默认模板

当您从Visual Studio中的模板或通过命令行创建新的MVC项目时,可以选择创建空的ASP.NET Core项目,Web API项目还是MVC Web应用程序项目。如果您创建一个“空”项目,那么生成的应用程序实际上是超轻量级的。 它不依赖于任何MVC构造,并且在运行时仅产生一个非常简单的“ Hello World”响应:

从ASP.Net Core Web Api模板中移除MVC Razor依赖项

另一方面,如果你选择了“ MVC Web app”模板的话,该模板会为您提供了更“完善”的应用。 如果您选择了身份验证选项,除了所有MVC配置和Razor视图模板外,它还可以包括ASP.NET Core Identity,EF Core和SQL Server集成:

从ASP.Net Core Web Api模板中移除MVC Razor依赖项

如果你选择了WebApi模板的话,会创建WebApi 应用并且包含一些必须的MVC依赖项,最简单的版本就包含了一个ValuesController。

从ASP.Net Core Web Api模板中移除MVC Razor依赖项

但是,虽然看起来很简单,但它也添加了用于创建完整MVC应用程序所有必需依赖包,即服务器端Razor依赖包。 这是因为它包含与整个MVC Web应用程序相同的Microsoft.AspNetCore.Mvc程序包,并在Startup.ConfigureServices中调用AddMvc()。如下图所示:

从ASP.Net Core Web Api模板中移除MVC Razor依赖项

从ASP.Net Core Web Api模板中移除MVC Razor依赖项

AddMvc()将会向服务容器中添加一堆各种服务, 其中一些是允许您使用Web API所必需的,但其中一些(尤其是与Razor相关的服务)对于Web API而言是不必要的。

在大多数情况下,使用Microsoft.AspNetCore.Mvc包是最容易的事情,但是有时您希望尽可能地减少依赖关系,并尽可能地减轻API的负担。 在这些场景下,您可能会发现仅专门添加应用程序所需的MVC软件包和服务会很有用。

三、添加依赖包的正确姿势

我们将从“空” Web应用程序模板开始,然后向其中添加Web API所需的包。您需要那些软件包将取决于您应用程序所需的功能。 默认情况下,Empty ASP.NET Core模板包括ApplicationInsights和Microsoft.AspNetCore元数据包,因此我将其留在项目中。

在这些之上,我将添加MVC.Core包,JSON格式化程序包和CORS包:

  • MVC Core软件包添加了所有必需的MVC类型,例如ControllerBase和RouteAttribute,以及许多依赖项,例如Microsoft.AspNetCore.Mvc.Abstractions和Microsoft.AspNetCore.Authorization。
  • JSON格式化程序包确保我们可以实际呈现Web API操作结果
  • CORS软件包增加了跨源资源共享(CORS)支持-这是Web API常见的要求,该Web API将托管在调用它们的客户端不同的域中。

最终的.csproj文件应如下所示:

从ASP.Net Core Web Api模板中移除MVC Razor依赖项

为了方便我练习我贴出文字版的项目文件:

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

  <PropertyGroup>
<TargetFramework>netcoreapp2.</TargetFramework>
</PropertyGroup> <ItemGroup>
<Folder Include="wwwroot\" />
</ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.1.0" />
<PackageReference Include="Microsoft.AspNetCore" Version="2.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Cors" Version="2.1.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Version="2.1.0" /> </ItemGroup> </Project>

还原完软件包后,现在我们就 可以更新Startup文件来添加我们的WebApi服务了.

四、在 Startup.cs文件中添加我们必须的服务

在大多数情况下,将Web API服务添加到项目中就像在ConfigureServices方法中调用AddMvc()一样简单。 但是,该方法增加了我们不需要的一些依赖项。 默认情况下,它将添加ApiExplorer,Razor视图引擎,Razor views,TagHelpers和DataAnnotations-目前我们都没有使用(如果后面用到了我们稍后再添加ApiExplorer和DataAnnotations都是可以的),但现在我们不需要。相反,我们只需要添加一下服务:

public void ConfigureServices(IServiceCollection services)
{
var builder = services.AddMvcCore();
builder.AddAuthorization();
builder.AddFormatterMappings();
builder.AddJsonFormatters();
builder.AddCors();
}

这就是我们需要的服务,好了,现在我们在添加所需要的中间件。

五、添加中间件

将MvcMiddleware添加到管道很简单。 我们只需要用UseMvc()替换了运行“ Hello World”中间件就行了。但是, 请注意,我们使用的是该方法的非参数化版本,该版本没有向该应用程序添加任何常规路由。 由于这是一个Web API,因此我将仅使用属性路由,因此无需设置常规路由。

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//if (env.IsDevelopment())
//{
// app.UseDeveloperExceptionPage();
//} //app.Run(async (context) =>
//{
// await context.Response.WriteAsync("Hello World!");
//}); loggerFactory.AddConsole(); if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseMvc();
}

这些就是我们所需要的MVC配置,最后,我们再来创建一个控制器,来看看是否能正确运行。

六、添加一个 MVC控制器

以这种方式创建Web API时需要注意的一个重要点就是:您必须使用ControllerBase类作为所有Controller的父类,而不是Controller。 后者在Microsoft.AspNetCore.Mvc程序包中已经定义但是我们没有添加。 幸运的是,它主要包含与渲染Razor有关的方法,因此这对我们来说不是问题。 ControllerBase类包含您可能会使用的所有各种StatusCodeResult帮助方法,例如下面的代码:

[Route("api/[controller]")]
public class ValuesController:ControllerBase
{
// GET api/values
[HttpGet]
public IActionResult Get()
{
return Ok(new string[] { "value1", "value2" });
}
}

运行结果如下:

从ASP.Net Core Web Api模板中移除MVC Razor依赖项

瞧! 这就是精简的Web API控制器,具有最小的依赖项。

七、扩展:AddWebApi扩展方法

最后梳理一下-我们的ConfigureServices方法看起来有点乱。 在这种方法中,我们可以通过创建一个扩展方法来减少Startup.cs类中的混乱情况,代码如下:

using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Internal; // ReSharper disable once CheckNamespace
namespace Microsoft.Extensions.DependencyInjection
{
public static class WebApiServiceCollectionExtensions
{
/// <summary>
/// Adds MVC services to the specified <see cref="IServiceCollection" /> for Web API.
/// This is a slimmed down version of <see cref="MvcServiceCollectionExtensions.AddMvc"/>
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <returns>An <see cref="IMvcBuilder"/> that can be used to further configure the MVC services.</returns>
public static IMvcBuilder AddWebApi(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services)); var builder = services.AddMvcCore();
builder.AddAuthorization(); builder.AddFormatterMappings(); // +10 order
builder.AddJsonFormatters(); builder.AddCors(); return new MvcBuilder(builder.Services, builder.PartManager);
} /// <summary>
/// Adds MVC services to the specified <see cref="IServiceCollection" /> for Web API.
/// This is a slimmed down version of <see cref="MvcServiceCollectionExtensions.AddMvc"/>
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="setupAction">An <see cref="Action{MvcOptions}"/> to configure the provided <see cref="MvcOptions"/>.</param>
/// <returns>An <see cref="IMvcBuilder"/> that can be used to further configure the MVC services.</returns>
public static IMvcBuilder AddWebApi(this IServiceCollection services, Action<MvcOptions> setupAction)
{
if (services == null) throw new ArgumentNullException(nameof(services));
if (setupAction == null) throw new ArgumentNullException(nameof(setupAction)); var builder = services.AddWebApi();
builder.Services.Configure(setupAction); return builder;
} }
}

最后,我们可以使用此扩展方法来整理我们的ConfigureServices方法:

public void ConfigureServices(IServiceCollection services)
{
services.AddWebApi();
}

这下看起来就清爽多了。

八、总结:

这篇文章展示了当您知道不需要Razor依赖时,如何从应用程序中移除它们。 这几乎使我们能在应用程序中使用的最小化的Web API。 我知道方法可能会有很多,但是,添加额外的功能(例如ApiExplorer)却很容易!好了,今天就聊到这里。幸运的是,Net Core 3.0 中已经为我们做了这些工作,如果不了解的可以参考我以前的文章,也可以查看源码。

参考文章 :https://andrewlock.net/removing-the-mvc-razor-dependencies-from-the-web-api-template-in-asp-net-core/

作者:郭峥

出处:http://www.cnblogs.com/runningsmallguo/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

从ASP.Net Core Web Api模板中移除MVC Razor依赖项的更多相关文章

  1. 如何在ASP&period;NET Core Web API测试中使用Postman

    使用Postman进行手动测试 如果您是开发人员,测试人员或管理人员,则在构建和使用应用程序时,有时了解各种API方法可能是一个挑战. 使用带有.NET Core的Postman为您的Web API生 ...

  2. ASP&period;NET Core Web API 集成测试中使用 Bearer Token

    在 ASP.NET Core Web API 集成测试一文中, 我介绍了ASP.NET Core Web API的集成测试. 在那里我使用了测试专用的Startup类, 里面的配置和开发时有一些区别, ...

  3. &lbrack;译&rsqb;ASP&period;NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

    [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 本文首发自:博客园 文章地址: https://www.cnblogs.com/yilezhu/p/ ...

  4. C&num;实现多级子目录Zip压缩解压实例 NET4&period;6下的UTC时间转换 &lbrack;译&rsqb;ASP&period;NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp&period;Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp&period;net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 &period;NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  5. List多个字段标识过滤 IIS发布&period;net core mvc web站点 ASP&period;NET Core 实战:构建带有版本控制的 API 接口 ASP&period;NET Core 实战:使用 ASP&period;NET Core Web API 和 Vue&period;js 搭建前后端分离项目 Using AutoFac

    List多个字段标识过滤 class Program{  public static void Main(string[] args) { List<T> list = new List& ...

  6. 使用JWT创建安全的ASP&period;NET Core Web API

    在本文中,你将学习如何在ASP.NET Core Web API中使用JWT身份验证.我将在编写代码时逐步简化.我们将构建两个终结点,一个用于客户登录,另一个用于获取客户订单.这些api将连接到在本地 ...

  7. ASP&period;NET Core Web API 索引 &lpar;更新Identity Server 4 视频教程&rpar;

    GraphQL 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(上) 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(下) [视频] 使用ASP.NET C ...

  8. ASP&period;NET Core Web API 教程 - Project Configuration

    ASP.NET Core Web API 教程 本系列文章主要参考了<Ultimate ASP.NET Core 3 Web API>一书,我对原文进行了翻译,同时适当删减.修改了一部分内 ...

  9. 在docker中运行ASP&period;NET Core Web API应用程序

    本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...

随机推荐

  1. 利用iframe无刷新上传文件的坑

    页面里经常要用到文件上传的功能,而且要求页面不刷新,先说一下原理:页面里放一个file控件和submit按钮,外面用form表单包住,给form表单加上对应的属性值,action.method.ent ...

  2. 1170&colon; 非常男女&lpar;XCOJ 前缀和&rpar;

    1170: 非常男女 时间限制: 1 Sec  内存限制: 128 MB提交: 22  解决: 9 标签提交统计讨论版 题目描述 Matrix67已经当过多次“媒人”了.他因此获得了许多经验.例如,距 ...

  3. How to support comparators in our sort implementations&quest;

    上图是普林斯顿算法课part1.Mergesort章节给出的参考代码,可以发现这个代码有三处警告.造成的隐患就是我们无法在类型检查时发现送入sort()函数的数组元素类型和Comparator的泛型不 ...

  4. 微信小程序Md5加密(utf-8汉字无影响)

    微信小程序不让使用第三方jqMD5 只好改原生js咯 废话不多说直接贴代码 其实就是将原生function调用改为 module.exports = md5; 文中 红色标注 使用方法 将md5.js ...

  5. recovery&amp&semi;linux系统升级数据更新分析总结

    先说说对升级的理解吧.系统升级是软件更新及BUG修复的主要方式,升级的主要原理就是数据搬移的过程,把我们需要的数据,从某个地方,更新到另外的一个地方.这个过程就叫做升级.一般是当我们系统有了新的功能增 ...

  6. WPF C&num; int&period;TryParse的用法

    ; if (!int.TryParse(item.Tag.ToString(), out comld)) { continue; } 没转换成功就continue 开始写成 if(GetNumber( ...

  7. ArrayList类中的contains&lpar;&rpar;方法底层依赖的是equals&lpar;&rpar;方法

    ArrayList类中的contains()方法底层依赖的是equals()方法.若集合中的元素是自定义对象,则应该重写该类父类Object的equals()方法,否则对象永远都不相同(因为都是new ...

  8. Eclipse 如何查看源代码

    Eclipse 关联源代码:

  9. vue项目打包后图片路径问题

    当用vue-cli自动构建项目后,有两种运行方法,分别是: npm run dev : 提供一个开发的环境,自动热更新,资源使用绝对路径,所以可以正常看到背景图片. npm run build : 打 ...

  10. google浏览器清除缓存

    google浏览器设置不缓存的方法 摘要:我们在做web开发的时候特别是在调试js时,会经常使用的google浏览器,这个时候就要我们修改过的代码可能不能生效.这是因为我们的浏览器默认是有缓存的,但是 ...