首页 > 编程语言 >探索ASP.NET Framework WebAPI的简介与应用

探索ASP.NET Framework WebAPI的简介与应用

时间:2023-08-05 13:02:23浏览次数:42  
标签:WebAPI ASP return string Framework new config public

一、什么是WebAPI?

1.1-什么是WebAPI?

WebAPI是一种用开发系统接口、设备接口API的技术,基于Http协议,请求和返回格式默认是Json格式。比WCF简单、更通用;比WebService更节省流量,更简洁。


1.2-WebAPI的特点?

  • Action方法直接返回对象,专注于数据
  • 更符合Restful的风格
  • 有利于独立于IIS部署
  • Action可以直接声明为async

二、什么是Restful?

2.1-传统的Http接口怎么设计?

探索ASP.NET Framework WebAPI的简介与应用_.NET Framework


2.2-Http设计之初"谓词语义"?

  • GET:查询获取
  • POST:添加
  • Put:修改
  • Delete:删除


2.3-Http设计之初"谓词语义"带来的好处是什么?

  • 为不同的请求做不同的权限的控制;
  • 不需要"Delete","AddNew"这样的Action名字,根据请求的类型就可以判断
  • 返回报文的格式也确定,不用在约定返回状态码,充分利用Http状态码
  • 有利于系统优化,浏览器可以自动缓存Get请求
  • Get没有副作用,是幂等的,可以重试。

注意:返回结果尽量根据Http状态码返回。


三、简单的WebAPI(.NET Framework)

3.1-简单WebAPI和是使用异步方式调用

/// <summary>
    /// 需要继承自ApiController
    /// </summary>
    public class PersonController : ApiController
    {
        public string[] Get() {
            return new string[] { "西瓜程序猿", "Albert" };
        }

        public string Get(int id) {
            return $"Haha:" + id;
        }

        public string Get(string name) {
            return name;
        }

    }
}

探索ASP.NET Framework WebAPI的简介与应用_ASP.NET_02


3.2-WebAPI的参数

探索ASP.NET Framework WebAPI的简介与应用_.NET Framework_03

探索ASP.NET Framework WebAPI的简介与应用_.NET Framework_04

探索ASP.NET Framework WebAPI的简介与应用_WEBAPI_05

探索ASP.NET Framework WebAPI的简介与应用_.NET Framework_06

探索ASP.NET Framework WebAPI的简介与应用_WEBAPI_07


3.3-WebAPI的返回值

探索ASP.NET Framework WebAPI的简介与应用_WEBAPI_08

/// <summary>
        /// HttpResponseMessage类型
        /// 返回报文头、内容等等信息(控制相应的内容)
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [Route("Test3")]
        public HttpResponseMessage Test3() {
            HttpResponseMessage msg = new HttpResponseMessage();
            msg.Content =new StringContent( "报文体");
            msg.Headers.Add("Haha", "这是请求头体");
            msg.StatusCode = System.Net.HttpStatusCode.OK;
            msg.Headers.Age = TimeSpan.FromDays(3);
            return msg;
        }


3.4-通过自定义路由处理API多版本

探索ASP.NET Framework WebAPI的简介与应用_WEBAPI_09

探索ASP.NET Framework WebAPI的简介与应用_ASP.NET_10

探索ASP.NET Framework WebAPI的简介与应用_.NET Framework_11


3.5-通过ControllerSelector实现多版本(配置路由规则)

(1)创建2个版本控制器

探索ASP.NET Framework WebAPI的简介与应用_.NET Framework_12


(2)在【WebApiConfig】的Register中,添加1个路由规则,并替换IHttpControllerSelector

config.Routes.MapHttpRoute(
                name: "DefaultApiV1",
                routeTemplate: "api/v1/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );


            //添加一个路由规则
            config.Routes.MapHttpRoute(
                name: "DefaultApiV2",
                routeTemplate: "api/v2/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );


            //替换
            config.Services.Replace(typeof(IHttpControllerSelector), new VersionControllerSelector(config));

(3)VersionControllerSelector.cs代码如下:

namespace Demo
{
    /// <summary>
    /// 用来控制API版本
    /// 需要继承自DefaultHttpControllerSelector
    /// </summary>
    public class VersionControllerSelector : DefaultHttpControllerSelector
    {
        private readonly HttpConfiguration _config;
        private IDictionary<string, HttpControllerDescriptor> _ctlMapping;

        public VersionControllerSelector(HttpConfiguration config) : base(config)
        {
            this._config = config;
        }


        public override IDictionary<string, HttpControllerDescriptor> GetControllerMapping()
        {
            Dictionary<string, HttpControllerDescriptor> dict = new Dictionary<string, HttpControllerDescriptor>();
            //加载所有程序集,然后遍历
            foreach (var asm in _config.Services.GetAssembliesResolver().GetAssemblies())
            {
                //获得程序集所有的类,并且该类不是抽象类,并且继承自ApiController
                var controllerTypes = asm.GetTypes().Where(u => u.IsAbstract == false && typeof(ApiController).IsAssignableFrom(u));
                //遍历并生成名字
                foreach (var ctrlType in controllerTypes)
                {
                    string ctrolTypeNS = ctrlType.Namespace;//获取命名空间名称
                    var match = Regex.Match(ctrolTypeNS, @"\.v(\d)");//获得需要的名称
                    if (!match.Success)
                    {
                        continue;
                    }

                    string verNum = match.Groups[1].Value;//拿到版本号1提取出来
                    string ctrlTypeName = ctrlType.Name;//拿到类名(PersonController)
                   //拿到匹配的类型
                    var matchController = Regex.Match(ctrlTypeName, @"^(.+)Controller$");
                    if (!matchController.Success)
                    {
                        continue;
                    }

                    string ctrlName = matchController.Groups[1].Value;//得到合法的PersonController
                    string key = ctrlName + "v" + verNum;
                    dict[key] = new HttpControllerDescriptor(_config, ctrlName,ctrlType);
                }
            }
            _ctlMapping = dict;
            return dict;
        }


        public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
        {

            //拿到controller
            string controller =(string)request.GetRouteData().Values["controller"];

            if (_ctlMapping == null) {
                //调用之前的方法拿到,key/value
                _ctlMapping = GetControllerMapping();
            }
           
            // /api/v1/person
            var matchVer = Regex.Match(request.RequestUri.PathAndQuery, @"/v(\d+)/");
            if (!matchVer.Success) {
                //我处理不了,让父类处理
                return base.SelectController(request);
            }
            string verNum = matchVer.Groups[1].Value;//2
            string key = controller + "v" + verNum;
            if (_ctlMapping.ContainsKey(key))
            {
                return _ctlMapping[key];
            }
            else {
                //我处理不了,让父类处理
                return base.SelectController(request);
            }
        }

    }
}

探索ASP.NET Framework WebAPI的简介与应用_.NET Framework_13

3.6-WebAPI中Filter-简单判断是否授权

(1)新建一个类。

探索ASP.NET Framework WebAPI的简介与应用_.NET Framework_14

(2)类的代码如下:

namespace Demo.Filter
{
    public class MyAuthorFilter : IAuthorizationFilter
    {
        public bool AllowMultiple => true;

        public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
        {

            IEnumerable<string> userNames;
            if (!actionContext.Request.Headers.TryGetValues("UserName", out userNames)){
                //返回未授权状态码
                return new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
            };
            string userName = userNames.First();
            if (userName == "admin")
            {
                return await continuation();
            }
            else {
                //返回未授权状态码
                return new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
            }
        }

    }
}

(3)在【WebApiConfig.cs】的Register方法进行注册自定义的Filter。

//注册自己写的Filter
config.Filters.Add(new MyAuthorFilter());

探索ASP.NET Framework WebAPI的简介与应用_ASP.NET_15

3.7-WebAPI的异常处理

系统错误:

探索ASP.NET Framework WebAPI的简介与应用_.NET Framework_16

业务错误:

探索ASP.NET Framework WebAPI的简介与应用_WEBAPI_17

探索ASP.NET Framework WebAPI的简介与应用_ASP.NET_18


3.8-接口的安全性问题

探索ASP.NET Framework WebAPI的简介与应用_.NET Framework_19

探索ASP.NET Framework WebAPI的简介与应用_C#_20

探索ASP.NET Framework WebAPI的简介与应用_.NET Framework_21

探索ASP.NET Framework WebAPI的简介与应用_.NET Framework_22


3.9-JWT介绍

探索ASP.NET Framework WebAPI的简介与应用_.NET Framework_23


3.10-接口安全传输

探索ASP.NET Framework WebAPI的简介与应用_WEBAPI_24


原文链接:https://blog.51cto.com/kimiliucn/6974858

标签:WebAPI,ASP,return,string,Framework,new,config,public
From: https://blog.51cto.com/kimiliucn/6974858

相关文章

  • 探索ASP.NET Framework WebAPI的简介与应用
    一、什么是WebAPI?1.1-什么是WebAPI?WebAPI是一种用开发系统接口、设备接口API的技术,基于Http协议,请求和返回格式默认是Json格式。比WCF简单、更通用;比WebService更节省流量,更简洁。1.2-WebAPI的特点?Action方法直接返回对象,专注于数据更符合Restful的风格有利于独立于IIS部......
  • java导出word加水印,使用aspose.words加freemaker实现
    先通过freemaker模板得到word文档通过aspose.words中的Document读取文档,使用aspose.wordsShape添加水印publicstaticvoidexportWordWaterMark(StringtemplateName,Map<String,Object>data,StringdocName,HttpServletResponseresponse,StringwatermarkText,Stringfo......
  • asp.net core之实时应用
    本文将介绍ASP.NETCoreSignalR,这是一个强大的实时通信库,用于构建实时、双向通信应用程序。我们将探讨SignalR的基本概念、架构和工作原理,并提供一些示例代码来帮助读者更好地理解和使用SignalR。ASP.NETCoreSignalR提供了一种简单而强大的方式来构建实时通信应用程序。SignalR......
  • Raspberry Pi(树莓派4B)4轻松入门(上)-安装
    1-RaspberryPi4入门RaspberryPi是一款功能齐全的计算机,包装小巧,价格实惠--虽然价格因计算能力而异,但基本的Pi4起价为35美元。无论您是想要一个可以用来执行日常计算任务的设备,如创建令人惊叹的程序、电路或控制其他物理设备,RaspberryPi都能满足需求。RaspberryPi品牌......
  • asp.net core之HttpClient
    本文介绍了ASP.NETCore中的HttpClient和HttpClientFactory的作用、用法以及最佳实践。通过示例代码的展示,读者可以了解如何使用HttpClient发送HTTP请求并处理响应,以及如何使用HttpClientFactory来解决HttpClient的一些问题,如资源泄漏和性能问题。同时,本文还强调了HttpClientFacto......
  • 【THM】OWASP 前10名—2021
    参考链接:https://www.cnblogs.com/Hekeats-L/p/16964401.html介绍该房间对每个OWASP主题进行了详细分析,并包含有关漏洞、它们如何发生以及如何利用它们的详细信息。您将通过完成支持性挑战将理论付诸实践。访问控制损坏加密失败注射不安全的设计安全配置错误易受攻击......
  • Asp.net Web Api .net6 Controller返回值总结
    1、特定的类型最基本的操作返回基元或复杂数据类型,例如, string 或自定义对象。请参考以下操作,该操作返回自定义 Product 对象的集合:[HttpGet]publicTask<List<Product>>Get()=>_productContext.Products.OrderBy(p=>p.Name).ToListAsync();2、返回IEnumer......
  • asp.net Core上传文件
    asp.netcore后台代码通过Request获取客户端上传的文件[HttpPost][Route("Upload")]publicasyncTask<IActionResult>uploadFiles(){try{foreach(varfilein......
  • C# 实现身份验证之WebApi篇
    【转】https://www.cnblogs.com/zhaoshujie/p/9761005.html今天再来总结关于如何实现WebApi的身份验证,以完成该系列所有文章,WebApi常见的实现方式有:FORM身份验证、集成WINDOWS验证、Basic基础认证、Digest摘要认证 第一种:FORM身份验证(若在ASP.NET应用程序使用,则该验证方式不支......
  • T4 模板: 为 ASP.NET MVC 开发人员快速入门指南
    http://blogs.msdn.com/b/webdev/archive/2009/01/29/t4-templates-a-quick-start-guide-for-asp-net-mvc-developers.aspx 在中提到我们的最近博客文章,ASP.NETMVC发布候选版,我们的代码生成功能(即,添加控制器和添加视图)现在使用T4(文本模板转换工具包)模板化技术在幕后。因为......