[ABP框架]动态web Api的拦截用法。

简介: 先进行配置首先这种需求,一般发生在APP端,我们给APP,不会给所有项目系统的接口给他们用。我们系统有200个接口,但是APP的需求只会用20个。那么这个需求也就应运而生了。

先进行配置

首先这种需求,一般发生在APP端,我们给APP,不会给所有项目系统的接口给他们用。我们系统有200个接口,但是APP的需求只会用20个。那么这个需求也就应运而生了。

img_7038b506c2e564e6c9a65a2cfdd0b862.png
项目结构.png

以上为API文件夹中为项目接口,没有啥特别复杂的东西存在。

首先创建好,一个网站项目,进行模块的配置。
首先引入以下的nuget包:
以下是WebApp项目中的packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Abp" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Castle.Log4Net" version="1.5.1" targetFramework="net452" />
  <package id="Abp.EntityFramework" version="1.5.1" targetFramework="net452" />
  <package id="Abp.EntityFramework.Common" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Owin" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Web" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Web.Api" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Web.Common" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Web.Mvc" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Web.Resources" version="1.5.2" targetFramework="net452" />
  <package id="Abp.Zero" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Zero.EntityFramework" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Zero.Owin" version="1.5.1" targetFramework="net452" />
  <package id="Antlr" version="3.5.0.2" targetFramework="net452" />
  <package id="bootstrap" version="3.0.0" targetFramework="net452" />
  <package id="Castle.Core" version="3.3.3" targetFramework="net452" />
  <package id="Castle.LoggingFacility" version="3.4.0" targetFramework="net452" />
  <package id="Castle.Windsor" version="3.4.0" targetFramework="net452" />
  <package id="EntityFramework" version="6.1.3" targetFramework="net452" />
  <package id="EntityFramework.DynamicFilters" version="1.4.11" targetFramework="net452" />
  <package id="JetBrains.Annotations" version="10.4.0" targetFramework="net452" />
  <package id="jQuery" version="1.6.4" targetFramework="net452" />
  <package id="log4net" version="2.0.8" targetFramework="net452" />
  <package id="Microsoft.AspNet.Identity.Core" version="2.2.1" targetFramework="net452" />
  <package id="Microsoft.AspNet.Identity.Owin" version="2.2.1" targetFramework="net452" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.Mvc.zh-Hans" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.Razor.zh-Hans" version="3.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.Web.Optimization.zh-Hans" version="1.1.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Client.zh-Hans" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Core.zh-Hans" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.HelpPage" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Owin" version="5.2.3" targetFramework="net461" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.WebHost.zh-Hans" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebPages.zh-Hans" version="3.2.3" targetFramework="net452" />
  <package id="Microsoft.Bcl" version="1.1.10" targetFramework="net452" />
  <package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net452" />
  <package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net452" />
  <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.3" targetFramework="net452" />
  <package id="Microsoft.Net.Compilers" version="1.3.2" targetFramework="net452" developmentDependency="true" />
  <package id="Microsoft.Owin" version="3.1.0" targetFramework="net452" />
  <package id="Microsoft.Owin.FileSystems" version="3.0.1" targetFramework="net452" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net452" />
  <package id="Microsoft.Owin.Security" version="3.1.0" targetFramework="net452" />
  <package id="Microsoft.Owin.Security.Cookies" version="3.0.1" targetFramework="net452" />
  <package id="Microsoft.Owin.Security.OAuth" version="3.0.1" targetFramework="net452" />
  <package id="Microsoft.Owin.StaticFiles" version="3.0.1" targetFramework="net452" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net452" />
  <package id="Modernizr" version="2.8.3" targetFramework="net452" />
  <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" />
  <package id="Nito.AsyncEx" version="4.0.1" targetFramework="net452" />
  <package id="Owin" version="1.0" targetFramework="net452" />
  <package id="Respond" version="1.2.0" targetFramework="net452" />
  <package id="Swashbuckle.Core" version="5.5.3" targetFramework="net461" />
  <package id="System.Collections.Immutable" version="1.3.1" targetFramework="net452" />
  <package id="System.Linq.Dynamic" version="1.0.7" targetFramework="net452" />
  <package id="WebGrease" version="1.6.0" targetFramework="net452" />
</packages>

新建一个'AbpProjectTemplateWebAppModule.cs' 的类文件:

  [DependsOn(
        typeof(AbpWebMvcModule),
        typeof(AbpZeroOwinModule),
        typeof(AbpProjectTemplateDataModule),
           typeof(AbpProjectTemplateWebAppApiModule),

        typeof(AbpProjectTemplateApplicationModule)

    )]
    public class AbpProjectTemplateWebAppModule : AbpModule
    {
        public override void PreInitialize()
        {
           
        }
        public override void Initialize()
        {
            //进行以来注入
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());

            IocManager.IocContainer.Register(
                Component
                    .For<IAuthenticationManager>()
                    .UsingFactoryMethod(() => HttpContext.Current.GetOwinContext().Authentication)
                    .LifestyleTransient()
            );
            //Areas
            AreaRegistration.RegisterAllAreas();

            //Routes
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            //Bundling
            BundleTable.Bundles.IgnoreList.Clear();
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
 
    }

对Global.asax文件进行修改,修改后:

    public class WebApiApplication : AbpWebApplication<AbpProjectTemplateWebAppModule>
    {
        protected override void Application_Start(object sender, EventArgs e)
        {
            //Use UTC clock. Remove this to use local time for your application.
             
            //Log4Net configuration
            AbpBootstrapper.IocManager.IocContainer
                .AddFacility<LoggingFacility>(f => f.UseAbpLog4Net()
                    .WithConfig("log4net.config")
                );

            base.Application_Start(sender, e);
        }

       
    }

不要尝试在webapp中,直接引入abp.webapi。我失败了两次,但是之前的0.97版本又是可以的。。

然后创建一个webappapi的类库:
引入如下的nuge包
这个是webAppApi项目中的package.config:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Abp" version="1.5.1" targetFramework="net452" />
  <package id="Abp.AutoMapper" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Web" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Web.Api" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Web.Common" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Zero" version="1.5.1" targetFramework="net452" />
  <package id="Abp.Zero.Owin" version="1.5.1" targetFramework="net452" />
  <package id="AutoMapper" version="5.2.0" targetFramework="net452" />
  <package id="Castle.Core" version="3.3.3" targetFramework="net461" />
  <package id="Castle.LoggingFacility" version="3.4.0" targetFramework="net452" />
  <package id="Castle.Windsor" version="3.4.0" targetFramework="net452" />
  <package id="JetBrains.Annotations" version="10.4.0" targetFramework="net452" />
  <package id="Microsoft.AspNet.Identity.Core" version="2.2.1" targetFramework="net452" />
  <package id="Microsoft.AspNet.Identity.Owin" version="2.2.1" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Owin" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.Bcl" version="1.1.10" targetFramework="net452" />
  <package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net452" />
  <package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net452" />
  <package id="Microsoft.Owin" version="3.1.0" targetFramework="net461" />
  <package id="Microsoft.Owin.Security" version="3.1.0" targetFramework="net461" />
  <package id="Microsoft.Owin.Security.Cookies" version="3.0.1" targetFramework="net461" />
  <package id="Microsoft.Owin.Security.OAuth" version="3.0.1" targetFramework="net461" />
  <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" />
  <package id="Nito.AsyncEx" version="4.0.1" targetFramework="net452" />
  <package id="Owin" version="1.0" targetFramework="net452" />
  <package id="Swashbuckle.Core" version="5.5.3" targetFramework="net452" />
  <package id="System.Collections.Immutable" version="1.3.1" targetFramework="net452" />
  <package id="System.Linq.Dynamic" version="1.0.7" targetFramework="net452" />
</packages>

然后下面就是创建一个"AbpProjectTemplateWebAppApiModule.cs"

 /// <summary>
    /// 在系统中进行WebApi的配置
    /// </summary>
    [DependsOn(typeof(AbpWebApiModule), typeof(AbpProjectTemplateApplicationModule))]
    public class AbpProjectTemplateWebAppApiModule : AbpModule
    {
       
        public override void Initialize()
        {
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());           
            Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
                .ForAll<IApplicationService>(typeof(AbpProjectTemplateApplicationModule).Assembly, "app")
                .Build();
            Configuration.Modules.AbpWebApi().HttpConfiguration.Filters.Add(new HostAuthenticationFilter("Bearer"));      
        }        
    }

然后就是配置EnableSwaggerUi了。这里的教程,请去看:ABP教程-给项目添加SwaggerUI,生成动态webapi

跑起来了后的截图:

img_e897d728bb5a9e42c6482bfb80e07b8e.png
API截图

接口太多了。那么我们就来折腾下
首先在application层创建一个

  /// <summary>
    /// 使用该特性进行app过滤
    ///  
    /// </summary>
    public class WebAppApiAttribute:System.Attribute
    {
        
    }

对AbpProjectTemplateWebAppApiModule中的配置方法进行改造下

Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
    .ForAll<IApplicationService>(Assembly.GetExecutingAssembly(), "app")
    .ForMethods(builder =>
    {
           if (!a.Method.IsDefined(typeof(WebAppApiAttribute)))
                        {
                            a.DontCreate = true;
                        }
    })
    .Build();

然后在特定的 方法上打上标记。

 public interface ICachingAppService : IApplicationService
    {
        [WebAppApi]
        ListResultDto<CacheDto> GetAllCaches();

        Task ClearCache(EntityDto<string> input);
        [WebAppApi]
        Task ClearAllCaches();
    }

然后我们运行项目,看到如下结果:

img_013d61a6394f38621554ecafd573360b.png
编译后的结果

更多的玩法,请参考官方文档:
Dynamic Web API Layer

https://aspnetboilerplate.com/Pages/Documents/v1.5.2/Dynamic-Web-API

目录
相关文章
|
2月前
|
API
用 Koa 框架实现一个简单的 RESTful API
用 Koa 框架实现一个简单的 RESTful API
|
23天前
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
54 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
|
2月前
|
缓存 API 数据库
Python哪个框架合适开发速卖通商品详情api?
在跨境电商平台速卖通的商品详情数据获取与整合中,Python 语言及其多种框架(如 Flask、Django、Tornado 和 FastAPI)提供了高效解决方案。Flask 简洁灵活,适合快速开发;Django 功能全面,适用于大型项目;Tornado 性能卓越,擅长处理高并发;FastAPI 结合类型提示和异步编程,开发体验优秀。选择合适的框架需综合考虑项目规模、性能要求和团队技术栈。
28 2
|
2月前
|
JSON JavaScript 中间件
Koa框架下的RESTful API设计与实现
在现代 Web 开发中,构建高效、可维护的 API 是至关重要的。Koa 是一个流行的 Node.js Web 应用框架,它具有简洁、灵活和强大的特性,非常适合用于设计和实现 RESTful API。
|
2月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
66 2
|
2月前
|
API PHP 数据库
PHP中哪个框架最适合做API?
在数字化时代,API作为软件应用间通信的桥梁至关重要。本文探讨了PHP中适合API开发的主流框架,包括Laravel、Symfony、Lumen、Slim、Yii和Phalcon,分析了它们的特点和优势,帮助开发者选择合适的框架,提高开发效率、保证接口稳定性和安全性。
72 3
|
2月前
|
安全 API 数据库
Python哪个框架合适开发淘宝商品详情api?
在数字化商业时代,开发淘宝商品详情API成为企业拓展业务的重要手段。Python凭借其强大的框架支持,如Flask、Django、Tornado和FastAPI,为API开发提供了多样化的选择。本文探讨了这些框架的特点、优势及应用场景,帮助开发者根据项目需求选择最合适的工具,确保API的高效、稳定与可扩展性。
31 0
|
2月前
|
安全 API 网络架构
Python中哪个框架最适合做API?
本文介绍了Python生态系统中几个流行的API框架,包括Flask、FastAPI、Django Rest Framework(DRF)、Falcon和Tornado。每个框架都有其独特的优势和适用场景。Flask轻量灵活,适合小型项目;FastAPI高性能且自动生成文档,适合需要高吞吐量的API;DRF功能强大,适合复杂应用;Falcon高性能低延迟,适合快速API开发;Tornado异步非阻塞,适合高并发场景。文章通过示例代码和优缺点分析,帮助开发者根据项目需求选择合适的框架。
192 0
|
3月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
175 3
|
29天前
|
前端开发 安全 JavaScript
2025年,Web3开发学习路线全指南
本文提供了一条针对Dapp应用开发的学习路线,涵盖了Web3领域的重要技术栈,如区块链基础、以太坊技术、Solidity编程、智能合约开发及安全、web3.js和ethers.js库的使用、Truffle框架等。文章首先分析了国内区块链企业的技术需求,随后详细介绍了每个技术点的学习资源和方法,旨在帮助初学者系统地掌握Dapp开发所需的知识和技能。
2025年,Web3开发学习路线全指南