自动给 Asp.Net Core Api 增加 ApiVersionNeutral

自动给 Asp.Net Core Api 增加 ApiVersionNeutral

Intro

新增加一个 Controller 的时候,经常忘记在 Controller 上增加 ApiVersion ,结果就导致前端使用指定的 ApiVersion 访问的时候就会失败,不支持的 Api 版本。

错误信息如下:

{	"error": {	"code": "UnsupportedApiVersion",	"message": "The HTTP resource that matches the request URI 'http://localhost:5000/api/values' does not support the API version '1.2'.",	"innerError": null	}	
}

因此希望可以在没有设置 ApiVersion 的时候也可以响应前端特定版本号的请求,而微软提供了 ApiVersionNeutral 可以忽略版本,任意版本号均可访问,于是就想自动给没有设置 ApiVersion 的 Controller 自动设置 ApiVersionNeutral,下面就通过分析源码来实现自动设置 ApiVersionNeutral

分析源代码

Asp.Net Core ApiVersion 源码地址:https://github.com/Microsoft/aspnet-api-versioning

使用 ApiVersion 会在注册服务的地方注册 ApiVersion 相关的服务

    services.AddApiVersioning();

找到源码 会发现注册服务的时候把 mvc 默认的 ActionSelector 替换成了 ApiVersionActionSelector,然后查看 ApiVersionActionSelector 的源码,找到了以下几处关键代码

ApiVersion 服务注册

640?wx_fmt=png

ApiVersionNetural

640?wx_fmt=png

ApiVersionNeutralAttribute

640?wx_fmt=png

ApiVersionActionSelector

640?wx_fmt=png

ControllerApiVentionBuilder

640?wx_fmt=png

总结如下:

如果 Controller 的 Attribute 定义的有 ApiVersionNeutralAttribute 就会忽略 ApiVersion 的限制,即使没有使用 ApiVersion 或者使用任意一个 ApiVersion 都可以路由到 Action,都可以访问得到,也不会出现开篇提到的错误。

解决方案

可以自己实现一个 IControllerModelConvention,去给没有定义 ApiVersion 的控制器加 ApiVersionNeutralAttribute,实现代码如下:

public class ApiControllerVersionConvention : IControllerModelConvention	
{	public void Apply(ControllerModel controller)	{	if (!(controller.ControllerType.IsDefined(typeof(ApiVersionAttribute)) || controller.ControllerType.IsDefined(typeof(ApiVersionNeutralAttribute))))	{	if (controller.Attributes is List<object>	attributes)	{	attributes.Add(new ApiVersionNeutralAttribute());	}	}	}	
}

在注册 Mvc 服务的时候,配置 MvcOptions

services.AddMvc(options =>	{	options.Conventions.Add(new ApiControllerVersionConvention());	});

启动项目,这时候再访问原来因为没有定义 ApiVersion 的控制器下的路由,这时就不会再报错了,使用任意一个 ApiVersion 也都不会有问题了,问题解决啦~~~

扩展方法

为了方便使用,你也可以加一个扩展方法,在扩展方法里配置 MvcOptions,根据自己的需要,我觉得两种方式都 OK 的,扩展方法示例如下:

public static class MvcBuilderExtensions	
{	public static IMvcBuilder AddApiControllerVersion(this IMvcBuilder builder)	{	if (builder == null)	{	throw new ArgumentNullException(nameof(builder));	}	builder.Services.Configure<MvcOptions>(options=> options.Conventions.Add(new ApiControllerVersionConvention()));	return builder;	}	
}

使用的时候可以直接在 AddMvc 之后加上扩展方法就可以了

services.AddMvc()	.AddApiControllerVersion();

实现源码

源码很简单,主要是看源码分析的过程,源码地址:https://github.com/WeihanLi/AspNetCorePlayground/blob/master/TestWebApplication/Conventions/ApiControllerConvention.cs

现在 .net core 是开源的,有许多问题都可以通过查看源码得到答案,有问题多 Google ,多看 Github 上的 issue,多看源码,相信大部分问题都可以解决了。

End

问题解决,完美收官,最后还是要说一下,注意这个的使用情景,如果你要指定一个默认的 ApiVersion 有更好的方法,直接配置 ApiVersioningOptions 中的 DefaultApiVersion就可以了

services.AddApiVersioning(options =>	{	options.AssumeDefaultVersionWhenUnspecified = true;	options.DefaultApiVersion = ApiVersion.Default;	});

如果你的 ApiVersion 不定,可能有些 Api 的 ApiVersion 会经常变,可以使用这种方式。

有问题欢迎联系~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K-means与高斯混合模型

K-means http://blog.pluskid.org/?p17 Clustering 中文翻译作“聚类”&#xff0c;简单地说就是把相似的东西分到一组&#xff0c;同 Classification (分类)不同&#xff0c;对于一个 classifier &#xff0c;通常需要你告诉它“这个东西被分为某某类”这样一些例子&#xf…

轻量级ORM《sqlcommon》第一个版本发布了

一、sqlcommon的特色1. 轻量级&#xff0c;整个包只有123kb。2. 性能好&#xff0c;自测。。。3. API和功能简单、代码简短、可维护性好基本都能看懂。这个点我认为很重要&#xff0c;你不用为了实现一个需求而四处查资料&#xff0c;这意味着这个包你可以自行维护修改&#xf…

从基于直方图的Graph-Cut到Grab-Cut

http://blog.csdn.net/zouxy09/article/details/8534954 区别&#xff1a; &#xff08;1&#xff09;Graph Cut的目标和背景的模型是灰度直方图&#xff0c;Grab Cut取代为RGB三通道的混合高斯模型GMM&#xff1b; &#xff08;2&#xff09;Graph Cut的能量最小化&#xf…

1024程序员节活动继续:购书优惠劵,折后再折,赶紧来抢啊

1024程序员节当当网计算机图书每满100减50&#xff01;满200减100&#xff01;满300-150&#xff01;机械工业出版社华章公司联合当当网特意为【DotNET技术圈】用户申请了一批可与满减叠加使用的“满200减30”的图书优惠码&#xff0c;优惠码使用后相当于&#xff1a;400减230 …

Shape Context

http://blog.csdn.net/u012507022/article/details/52437149 形状上下文特征是一种很流行的形状描述子&#xff0c;多用于目标识别&#xff0c;它采用一种基于形状轮廓的特征描述方法,其在对数极坐标系下利用直方图描述形状特征能够很好地反映轮廓上采样点的分布情况。 形状上下…

使用Magicodes.SwaggerUI快速配置SwaggerUI以及设置API分组

Magicodes.SwaggerUI快速配置和集成SwaggerUI特点通过配置文件简单配置即可完成SwaggerUI的API格式JSON生成和集成支持API分组和隐藏支持自定义页面和验证Nuget包联系我们订阅号关注“麦扣聊技术”微信订阅号可以获得最新文章、教程、文档。QQ群编程交流群<85318032>产品…

机器学习四大降维方法

http://www.36dsj.com/archives/26723 引言 机器学习领域中所谓的降维就是指采用某种映射方法&#xff0c;将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y&#xff0c;其中x是原始数据点的表达&#xff0c;目前最多使用向量表达形式。…

深入研究.NET Core的本地化机制

ASP.NET Core中提供了一些本地化服务和中间件&#xff0c;可将网站本地化为不同的语言文化。ASP.NET Core中我们可以使用Microsoft.AspNetCore.Localization库来实现本地化。在.NET Core 2.0以上版本, Microsoft.AspNetCore.Localization已经包含在了Microsoft.AspNetCore.All中…

深度学习机器选择

Description Quantity Unit Price Amount Intel Core™ i7-6700K Processor (Skyshake, 8M Cache, Socket-LGA1151, 14nm, Overlock unlock, 4Core 8Threads, TDP 95W, Gen 9LP, up to 4.20 GHz) 1 ANTEC TPC750 TruePower Classic 750W 80Plus Gold 火牛 1 …

.Net Core 3.0 IdentityServer4 快速入门02

.Net Core 3.0 IdentityServer4 快速入门—— resource owner password credentials&#xff08;密码模式&#xff09;一、前言OAuth2.0默认有四种授权模式&#xff08;GrantType&#xff09;&#xff1a;1&#xff09;授权码模式2&#xff09;简化模式3&#xff09;密码模式&a…

LMDB使用说明

http://rayz0620.github.io/2015/05/25/lmdb_in_caffe/ 官方的extract_feature.bin很好用&#xff0c;但是输出的特征是放在LMDB里的。以前嫌LMDB麻烦&#xff0c;一直都图方便直接用ImageDataLayer来读原始图像。这次绕不过去了&#xff0c;就顺便研究了一下Caffe对LMDB的使用…

.Net Core3.0 日志 logging

多年的经验&#xff0c;日志记录是软件开发的重要组成部分。没有日志记录机制的系统不是完善的系统。在开发阶段可以通过debug附件进程进行交互调试&#xff0c;可以检测到一些问题&#xff0c;但是在上线之后&#xff0c;日志的记录起到至关重要的作用。它可使我们在系统出现问…

Linux下的磁盘空间管理

df -h /文件夹名 du -sh /文件夹名 后者统计的是我们能点开到的文件占用的空间&#xff0c;前者是总空间减去剩余空间。 可能出现的情况是二者不统一&#xff0c;原因见下&#xff1a; http://wushank.blog.51cto.com/3489095/1533409 一、df和du的统计机制&#xff1a; …

在微软工作一年,我学会了什么

大家好&#xff0c;我是运营小马。正如我们所知道的那样&#xff0c;10.23日 &#xff0c;崔庆才因为写文写得很痛苦&#xff0c;将公众号转给我运营。10.24 我兴致勃勃又小心翼翼的宣布了我要运营10.25 崔庆才回来了&#xff0c;他说他有喷薄而出抑制不住的写作欲望&#xff0…

Eclipse调试方法

http://blog.jobbole.com/93421/ 一、Eclipse调试介绍 二、Eclipse中和Debug相关的视图 2.1 Debug View2.2 Variables View2.3 Breakpoints View2.4 Expressions View2.5 Display View 三、Debug 3.1 设置断点 3.2 调试程序 3.2.1 调试本地 Java 语言程序 3.3.2 远程调试 一、…

聊聊 Docker Swarm 部署 gRPC 服务的坑

gRPC 是一个高性能、开源和通用的 RPC 框架&#xff0c;面向移动和 HTTP/2 设计&#xff0c;也是目前流行的微服务架构中比较突出的跨语言 RPC 框架。一直以来&#xff0c;我们的微服务都是基于 gRPC 来开发&#xff0c;使用的语言有 .NET、JAVA、Node.js&#xff0c;整体还比较…

动手造轮子:实现一个简单的依赖注入(零)

动手造轮子&#xff1a;实现一个简单的依赖注入(零)Intro依赖注入为我们写程序带来了诸多好处&#xff0c;在微软的 .net core 出来的同时也发布了微软开发的依赖注入框架 Microsoft.Extensions.DependencyInjection&#xff0c;大改传统 asp.net 的开发模式&#xff0c;asp.ne…

Caffe Blob Dtype理解

http://blog.luoyetx.com/2015/10/reading-caffe-2/ 关于Blob: Blob 在 Caffe 中扮演了重要的角色&#xff0c;用于存储数据和网络参数&#xff0c;同时也在 CPU 和 GPU 之间做了数据同步。Blob 原本在 Caffe 中被表示为一个 4 维数组 (num x channel x height x width)&#…

【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(2)

上一章《回忆一下我们的登录逻辑,主要有以下4点:当"用户名"或"密码"为空时, 是不允许登录的("登录"按钮处于禁用状态).用户名或密码不正确时, 显示"用户名或密码不正确"的消息框.用户名输入"waku", 并且密码输入"123&q…

MATLAB读取文件夹及其所有子文件夹内的图像

1。 指定路径下 单个文件夹data中所有图像 file_path .\data\;% 图像文件夹路径img_path_list dir(strcat(file_path,*.jpg));%获取该文件夹中所有jpg格式的图像img_num length(img_path_list);%获取图像总数量if img_num > 0 %有满足条件的图像for j 1:img_num %逐一读…