精华内容
下载资源
问答
  • webapi接口缓存组件

    2016-08-17 10:48:45
    自己实现的一个简单的webapi接口缓存组件,实现很简单,使用也很方便,可以自己扩展。
  • webapi接口缓存组件.rar

    2021-07-28 15:07:02
    接口添加缓存
  • 在ASP.NET WebAPI使用缓存

    千次阅读 2019-04-27 08:45:18
    初步看了下CacheCow与OutputCache,感觉还是CacheOutput比较...Install-Package Strathweb.CacheOutput.WebApi2 基础使用 CacheOutput特性 [Route("get")] [CacheOutput(ClientTimeSpan = 60, ServerTimeSpa...

    初步看了下CacheCowOutputCache,感觉还是CacheOutput比较符合自己的要求,使用也很简单

    PM>Install-Package Strathweb.CacheOutput.WebApi2

    基础使用

    CacheOutput特性

     

    [Route("get")]
    [CacheOutput(ClientTimeSpan = 60, ServerTimeSpan = 60)]
    public IEnumerable<string> Get()
    {
       return new string[] { "Tom", "Irving" };
    }
            
    

     

    以参数为key

     

     [Route("get")]
            [CacheOutput(ServerTimeSpan = 50, ExcludeQueryStringFromCacheKey = true)]
            public string Get(int id)
            {
                return DateTime.Now.ToString();
            }
           
    

     

    Etag头

    image

    使用Redis

    客户端使用StackExchange.RedisInstall-Package StackExchange.Redis.StrongName 

    在Autofac中注册Redis连接

        var builder = new ContainerBuilder();
        //注册api容器的实现
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
        //注册mvc容器的实现
        // builder.RegisterControllers(Assembly.GetExecutingAssembly());
        //在Autofac中注册Redis的连接,并设置为Singleton 
        builder.Register(r =>
        {
           return ConnectionMultiplexer.Connect(DBSetting.Redis);
        }).AsSelf().SingleInstance();
        var container = builder.Build();
        GlobalConfiguration.Configuration.DependencyResolver = new 
        AutofacWebApiDependencyResolver(container);

     

    通过构造注入即可

    /// <summary>
        ///Redis服务
        /// </summary>
        public class RedisService : IRedisService
        {
            private static readonly Logger logger = LogManager.GetCurrentClassLogger();
    
            /// <summary>
            ///Redis服务
            /// </summary>
            private readonly ConnectionMultiplexer _connectionMultiplexer;
    
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="connectionMultiplexer">Redis服务</param>
            public RedisService(ConnectionMultiplexer connectionMultiplexer)
            {
                _connectionMultiplexer = connectionMultiplexer;
            }
    
            /// <summary>
            /// 根据KEY获得值
            /// </summary>
            /// <param name="key">key</param>
            /// <returns></returns>
            public async Task<WebAPIResponse> Get(string key)
            {
                try
                {
                    var db = _connectionMultiplexer.GetDatabase();
                   /*
                   var set = await db.StringSetAsync("name", "irving");
                   var get = await db.StringGetAsync("name");
                   */
                    return new WebAPIResponse
                    {
                        IsError = false,
                        Msg = string.Empty,
                        Data = await db.StringGetAsync(key)
                    };
                }
                catch (Exception ex)
                {
                    logger.Error(ex, "RedisService Get Exception : " + ex.Message);
                    return new WebAPIResponse
                   {
                       IsError = false,
                       Msg = string.Empty,
                       Data = string.Empty
                   };
                }
            }
        }
    
    
    CacheOutput与Redis
    默认CacheOutput使用System.Runtime.Caching.MemoryCache来缓存数据,可以自定义扩展到DB,Memcached,Redis等;只需要实现IApiOutputCache接口
    
    
    
    public interface IApiOutputCache
    {
        T Get<T>(string key) where T : class;
        object Get(string key);
        void Remove(string key);
        void RemoveStartsWith(string key);
        bool Contains(string key);
        void Add(string key, object o, DateTimeOffset expiration, string dependsOnKey = null);
    }

     

    实现服务

    /// <summary>
        /// 实现Redis服务
        /// </summary>
        public class RedisCacheProvider : IApiOutputCache
        {
            /// <summary>
            ///Redis服务
            /// </summary>
            private readonly ConnectionMultiplexer _connectionMultiplexer;
    
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="connectionMultiplexer">Redis服务</param>
            public RedisCacheProvider(ConnectionMultiplexer connectionMultiplexer)
            {
                _connectionMultiplexer = connectionMultiplexer;
            }
    
            public void Add(string key, object o, DateTimeOffset expiration, string dependsOnKey = null)
            {
                throw new NotImplementedException();
            }
    
            public IEnumerable<string> AllKeys
            {
                get { throw new NotImplementedException(); }
            }
    
            public bool Contains(string key)
            {
                throw new NotImplementedException();
            }
    
            public object Get(string key)
            {
                var db = _connectionMultiplexer.GetDatabase();
                return db.StringGet(key);
            }
    
            public T Get<T>(string key) where T : class
            {
                throw new NotImplementedException();
            }
    
            public void Remove(string key)
            {
                throw new NotImplementedException();
            }
    
            public void RemoveStartsWith(string key)
            {
                throw new NotImplementedException();
            }
        }

     

    注册WebAPIConfig

    configuration.CacheOutputConfiguration().RegisterCacheOutputProvider(() => RedisCacheProvider);

    或者使用Autofac for Web API

    var builder = new ContainerBuilder();
    builder.RegisterInstance(new RedisCacheProvider());
    config.DependencyResolver = new AutofacWebApiDependencyResolver(builder.Build());

    REFER: 
    Lap around Azure Redis Cache 
    http://azure.microsoft.com/blog/2014/06/04/lap-around-azure-redis-cache-preview/ 
    Caching data in Azure Redis Cache 
    https://msdn.microsoft.com/en-us/library/azure/dn690521.aspx 
    ASP.NET Output Cache Provider for Azure Redis Cache 
    https://msdn.microsoft.com/en-us/library/azure/dn798898.aspx 
    How to use caching in ASP.NET Web API? 
    http://stackoverflow.com/questions/14811772/how-to-use-caching-in-asp-net-web-api 
    Output caching in ASP.NET Web API 
    http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/ 
    NuGet Package of the Week: ASP.NET Web API Caching with CacheCow and CacheOutput 
    http://www.hanselman.com/blog/NuGetPackageOfTheWeekASPNETWebAPICachingWithCacheCowAndCacheOutput.aspx 
    使用CacheCow和ETag缓存资源 
    http://www.cnblogs.com/fzrain/p/3618887.html 
    ASP.NET WebApi - Use Redis as CacheManager 
    http://www.codeproject.com/Tips/825904/ASP-NET-WebApi-Use-Redis-as-CacheManager 
    RedisReact 
    https://github.com/ServiceStackApps/RedisReact 
    .Net缓存管理框架CacheManager 
    http://www.cnblogs.com/JustRun1983/p/CacheManager.html

    原文链接:https://www.cnblogs.com/Irving/p/4618556.html

    展开全文
  • ASP.NET Web API实现缓存的2种方式

    千次阅读 2019-01-08 06:30:18
    在ASP.NET Web API中实现缓存大致有2种思路。一种是通过ETag, 一种是通过类似ASP.NET MVC中的OutputCache。通过ETag实现缓存首先安装cachecow.serverinstall-package cachecow.server在WebApiConfig中。   ...

     

    在ASP.NET Web API中实现缓存大致有2种思路。一种是通过ETag, 一种是通过类似ASP.NET MVC中的OutputCache。

    通过ETag实现缓存

    首先安装cachecow.server

    install-package cachecow.server

    在WebApiConfig中。

     

    public static class WebApiConfig
    {
        public static HttpConfiguraiton Register()
        {
            var config = new HttpConfiguration();
            
            //支持通过特性设置路由
            config.MapHttpAttributeRoutes();
            
            config.Routes.MapHttpRoute(
                "DefaultRouting",
                "api/{controller}/{id}",
                defaults:new {id = RouteParamter.Optional}
            );
            
            //config.Formatters.JsonFormatter.SupportedMediaTypes
                .Add(new MediaTYpeHeaderValue("text/html"));
                
            config.Formatters.XmlFormatter.SupportedMediaType.Clear();
            
            config.Foramtters.JsonFormatter.SuppoortedMediaTypes.Add(
                new MediaTypeHeaderValue("application/json-patch+json");
            );
            
            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCaseProeprtyNamesContractResolver();
            
            //HTTP缓存 默认缓存在内存中
            config.MessageHandlers.Add(new CacheCow.Server.CachingHandler(config));
            
            return config;
        }
    }

     

    → 客户端发出请求

    GET http://localhost:43321/api/groups/1

    → 返回200状态码,在响应的Headers中:

    ETag:W/"..."
    Last-Modified:...

    → 再次请求,通过If-None-Match属性把ETag带上。

    GET http://localhost:43321/api/groups/1
    Host:localhost:43321
    If-None-Match:ETag:W/""

    → 返回304状态码


    通过OutputCache实现缓存

    在ASP.NET Web API中实现缓存的另外一种思路是通过类似ASP.NET MVC中的OutputCache,具体可参考:Strathweb.CacheOutput.WebApi2

    有关ASP.NET Web API缓存,在"ASP.NET Web API中通过ETag实现缓存"中也做了总结。

     

    展开全文
  • net core WebApi——缓存神器Redis

    千次阅读 2019-09-23 09:48:56
    文章目录前言Redis使用RedisUtil测试小结 前言 中秋过完不知不觉都已经快两周没动这个工程了,最近业务需要总算开始搞后台云服务了,果断直接net core搞起,在做的中间遇到了不少问题,这个后续会一点点列出来包括...

    前言

    中秋过完不知不觉都已经快两周没动这个工程了,最近业务需要总算开始搞后台云服务了,果断直接net core搞起,在做的中间遇到了不少问题,这个后续会一点点列出来包括解决方法,今天就先把之前挖的坑填一个。

    Redis

    之前在缓存那篇提到过,CookieSessionCache这几个不同的缓存方式,Cookie是存在客户端浏览器的,Session实质上也是客户端的存储,至于Cache是服务端的,但是如果是分布式的话,这几个方式可能除了Cookie其他两个都要有点儿问题,毕竟一台服务只存储自身一台,如果多台的话,需要涉及到多服务的交互,比如一台服务做了Cache存储,需要给其他服务发送内部信号或是http请求,其他服务根据请求执行对应操作。

    当然这是在没有用到Redis的前提下,Redis是解决分布式缓存的神器,相当于是自身一台服务器专门处理数据的读写,可以理解为数据服务器(个人感觉。。。),至于自己业务的分布式只是为了业务需要去执行,需要用到数据缓存即可直接调用Redis的读写操作(当然,各个服务的Redis配置要保持一致)。

    Redis的安装和配置在Linux配置部署_新手向(四)——Redis安装与配置已经说过,当时就是为了使用Redis而做了个小铺垫。

    使用

    首先,只要是类库肯定是引入Nuget包了,我们在April.Util引入Microsoft.Extensions.Caching.Redis,当然其他也有StackExchange.RedisCSRedisCore,这里先试试官方的吧,官方扩展包地址

    引入完之后,我们在appsettings.json来配置下地址目录。
    配置
    之后我们看下Redis的方法,毕竟调用第三方都是看看然后根据自己需要裹一下。
    Redis
    也是先要初始化配置信息,然后创建实体对象,调用方法,这里说明下,默认的value值是byte[],当然官方也有扩展方法。
    Redis
    好了,看完了方法,我们来开始Util吧。

    RedisUtil

    首先,我们还是要先做配置信息,前面已经在appsettings写过配置信息,这里直接在AprilConfig中添加上。

    private static string _IsOpenCache = string.Empty;
            /// <summary>
            /// 是否使用Redis
            /// </summary>
            public static bool IsOpenCache
            {
                get
                {
                    if (string.IsNullOrEmpty(_IsOpenCache))
                    {
                        _IsOpenCache = Configuration["Redis:IsOpenRedis"];
                    }
                    if (_IsOpenCache.ToLower() == "true")
                    {
                        return true;
                    }
                    return false;
                }
            }
    
            private static string _RedisConnectionString = string.Empty;
            /// <summary>
            /// Redis默认连接串
            /// </summary>
            public static string RedisConnectionString
            {
                get
                {
                    if (string.IsNullOrEmpty(_RedisConnectionString))
                    {
                        _RedisConnectionString = Configuration["Redis:ConnectionString"];
                    }
                    return _RedisConnectionString;
                }
            }
    

    配置信息设置完成之后,开始初始化Redis的方法。

            private static RedisCache _redisCache = null;
            private static RedisCacheOptions options = null;
            /// <summary>
            /// 初始化Redis
            /// </summary>
            public static void InitRedis()
            {
                if (AprilConfig.IsOpenCache)
                {
                    _redisCache = new RedisCache(GetOptions());
                }
            }
            /// <summary>
            /// 获取配置项信息
            /// </summary>
            /// <returns></returns>
            protected static RedisCacheOptions GetOptions()
            {
                options = new RedisCacheOptions();
                options.Configuration = AprilConfig.RedisConnectionString;
                options.InstanceName = "April.Redis";
                return options;
            }
            /// <summary>
            /// 添加数据
            /// </summary>
            /// <param name="key">键</param>
            /// <param name="value">值</param>
            /// <param name="ExprireTime">过期时间</param>
            public static void Add(string key, object value, int ExprireTime = 10)
            {
                if (string.IsNullOrEmpty(key))
                {
                    return;
                }
                string strValue = string.Empty;
                try
                {
                    strValue = JsonConvert.SerializeObject(value);
                }
                catch (Exception ex)
                {
                    LogUtil.Error($"Redis.Add转换失败:{ex.Message}");
                }
                if (!string.IsNullOrEmpty(strValue))
                {
                    _redisCache.SetString(key, strValue, new Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions()
                    {
                        AbsoluteExpiration = DateTime.Now.AddMinutes(ExprireTime)
                    });
                }
            }
            /// <summary>
            /// 获取数据(对象)
            /// </summary>
            /// <typeparam name="T">对象类型</typeparam>
            /// <param name="key">键</param>
            /// <returns></returns>
            public static T Get<T>(string key)
            {
                string value = Get(key);
                if (string.IsNullOrEmpty(value))
                {
                    return default(T);
                }
                T obj = default(T);
                try
                {
                    obj = JsonConvert.DeserializeObject<T>(value);
                }
                catch (Exception ex)
                {
                    LogUtil.Error($"Redis.Get转换失败:{ex.Message},数据:{value}");
                }
                return obj;
            }
            /// <summary>
            /// 移除数据
            /// </summary>
            /// <param name="key">键</param>
            public static void Remove(string key)
            {
                if (!string.IsNullOrEmpty(key))
                {
                    _redisCache.Remove(key);
                }
            }
            /// <summary>
            /// 重置数据
            /// </summary>
            /// <param name="key">键</param>
            /// <param name="value">值</param>
            /// <param name="expireTime">过期时间</param>
            public static void Replace(string key, object value, int expireTime = 10)
            {
                if (!string.IsNullOrEmpty(key))
                {
                    Remove(key);
                    Add(key, value, expireTime);
                }
            }
    

    具体使用的方法,这里不多写了,代码地址见net core Webapi 总目录,感觉代码贴的多了,自己也习惯了复制粘贴,看一个封装好的方法,就要去看他的源码(如果只是用的话就算了),这样对方法的使用以及自身的业务需要封装会有很好的帮助,毕竟会用是第一步,会改是第二步,封装是第三步,自己写那就是最终级了(这句纯属自勉)。

    测试

    好了,写完之后,习惯来一遍测试,不想自己整理的东西最终还是不能用,千篇一律不可怕,可怕的是不知道最终的效果。
    新增
    测试
    结果
    获取
    测试
    结果
    覆盖
    ps:说是覆盖,其实就是删除然后新增-,-|||
    测试
    结果
    删除
    测试
    结果

    小结

    写到这里基本上都结束了,简单的说明了Redis的使用,后续还是会不断更新,比如那么多database,如果随意切换,redis存储之后会不会有什么其他问题等等,学以致用,用方知错,错而能改,改了就行

    展开全文
  • 不知道大家是否遇到过Web ... 当然这种方式适合你自己写的web request,SDK中自带的Xrm.WebApi的接口就不行了。 var req = new XMLHttpRequest(); req.open(GET, encodeURI(Xrm.Utility.getGlobalContext().getClien
  • K-Dice-WebApi 使用 WebAPI、Grunt 和 Angular 的 Project K Web 应用程序 使用 Visual Studio 2015 预览版构建 包括调试/零售构建、LESS 编译、捆绑、缩小、缓存破坏、清理和监视
  • 图表API WebAPI,AutoMapper,Dapper,IoC,缓存示例
  • WebAPI使用

    热门讨论 2019-03-01 08:10:55
    Web API 和 WCF 的比较 WCF特点 1、这个也是基于SOAP的,数据格式是XML 2、这个是Web Service(ASMX)的进化版,可以支持各种各样的协议,像TCP,HTTP,HTTPS,Named Pipes, MSMQ. 3、WCF的主要问题是,它配置...

    Web API 和 WCF 的比较

    WCF特点

    1、这个也是基于SOAP的,数据格式是XML

    2、这个是Web Service(ASMX)的进化版,可以支持各种各样的协议,像TCP,HTTP,HTTPS,Named Pipes, MSMQ.

    3、WCF的主要问题是,它配置起来特别的繁琐

    4、它不是开源的,但可以被任意一个了解XML的人使用

    5、它可以部署应用程序中或者IIS上或者Windows服务中

    Web API特点

    1、这是一个简单的构建HTTP服务的新框架

    2、在.net平台上Web API 是一个开源的、理想的、构建REST-ful 服务的技术

    3、不像WCF REST Service.它可以使用HTTP的全部特点(比如URIs、request/response头,缓存,版本控制,多种内容格式)

    4、它也支持MVC的特征,像路由、控制器、action、filter、模型绑定、控制反转(IOC)或依赖注入(DI),单元测试。这些可以使程序更简单、更健壮

    5、它可以部署在应用程序和IIS上

    6、这是一个轻量级的框架,并且对限制带宽的设备,比如智能手机等支持的很好

    7、Response可以被Web API的MediaTypeFormatter转换成Json、XML 或者任何你想转换的格式。

    WCF和WEB API应用场景

    WCF应用场景:

    1、当你想创建一个支持消息、消息队列、双工通信的服务时,你应该选择WCF。

    WEB API应用场景:

    1.当你想创建一个基于HTTP的面向资源的服务并且可以使用HTTP的全部特征时(比如URIs、request/response头,缓存,版本控制,多种内容格式),你应该选择Web API。

    2.当你想让你的服务用于浏览器、手机、iPhone和平板电脑时,你应该选择Web API。

    WEB API 项目的创建和WEB API集成Swagger的使用

    链接:https://pan.baidu.com/s/1gKWZRsFCfX2gfff3iVyNMw
    提取码:uh0w

    展开全文
  • Web Api 创建及其使用

    万次阅读 2019-01-21 20:25:00
    由于创建博客,我需要尝试一些新的技术,新的思路,所以我没规规矩矩的写博客,用上了诸多以前没用的东西,比如现在这个(我只是听过webapi我连webserver都只是用过两三次/手动滑稽) 昨天开始研究的,一直到现在,...
  • 使用webapi做rest的服务接口时,有些读取数据表的操作,数据本身变化不频繁,但是访问量却不小,比如频道分类,地市选择信息等等等等。这时,必然想到使用缓存。  在普通controller下,由于controller实现了一堆...
  • Strathweb.CacheOutput, 允许你缓存ApiControllers输出的ASP.NET Web API CacheOutput库 ASP.NET Web API CacheOutput与"outputcacheattribute"类似的小型库,类似于mvc的,用于 Web API 操作。CacheOutput 将负责...
  • 一个小型库,将类似于MVC的“ OutputCacheAttribute”的缓存选项引入Web API操作。 CacheOutput将负责服务器端缓存,并为您设置适当的客户端(响应)标头。 您可以指定以下属性: ClientTimeSpan (对应于Cache...
  • asp.net webapi使用redis

    2020-06-15 20:37:13
    } } } 该工具类基于网上找的代码简化而来,只保留了数据库连接对象,便于对redis库进行操作 三、web.config添加配置 在connectionStrings节点添加子节点 由于api服务器和redis服务器处于同一局域网,这里的数据连接...
  • 使用ASP.NET Web API构建RESTful API

    千次阅读 2017-11-01 11:27:05
    它也是构建Web API的强大平台,使用少量动词(GET,POST等)加上一些简单的概念,如URI和头文件。ASP.NET Web API是一组简化HTTP编程的组件。因为它构建在ASP.NET MVC运行时之上,Web API自动处理HTTP的低级传输细节...
  • 直接进入正题,使用net core 3.0 webapi进行写一个demo,注册中间件代码、接口请求缓存的demo 启用中间件代码,如下所示 这个写一个测试的Demo控制器 这个使用可以启用代码,然后来调试一下看一看...
  • 休息 InterSystems缓存上的REST Web API的基本类 特征 支持非拉丁字符 开箱即用的完整JSON支持 要求验证 CORS支持 授权和会话支持
  • WebApiDemo2017.rar

    2019-09-23 12:16:42
    自己写了个WebAPI DEMO,里边集成了LOG记录,异常处理,SQLSuger(ORM插件),缓存处理,方便快速搭建webapi,供大家参考
  • Redis API接口缓存优化实战

    千次阅读 2019-08-29 17:32:48
    Redis 缓存请求内容,优化 API 接口性能 在我们日常的接口开发过程中,或者第三方请求的过程中,每次刷新页面...我们这章节呢,将会使用Redis对第三方请求内容做个一个定期缓存,在某个时限内,我们将会直接从本地...
  • MDN Web 技术文档 Web API 接口

    千次阅读 2017-07-05 10:28:40
    MDN Web 技术文档 Web API 接口
  • webapi 访问权限

    千次阅读 2018-06-05 15:44:36
    最近在做一个项目,前台使用的是angularjs,后台使用的是webapiwebapi不需要登陆,只需要知道方法就能直接访问,这个就比较郁闷了。因为之前也没有做过权限控制的问题,百度搜到了不少,但是都不能用,只能自己解决...
  • 前端 api 请求缓存方案

    千次阅读 2019-04-27 10:45:56
    在开发 web 应用程序时,性能都是必不可少的话题。对于webpack打包的单页面应用程序而言,我们可以采用很多方式来对性能进行优化,比方说 tree-shaking...而事实上,缓存一定是提升web应用程序有效方法之一,尤其是...
  • 在AspNet.WebApi使用Razor

    千次阅读 2015-08-06 20:27:02
    本文用到组件...关于RazorEngine的详细使用,请参看RazorEngine相关教程。 一、规则定义,视图存放路径 沿用ASP.NET MVC的视图存放规则:~/Views/{controller}/{action}.cshtml。(不考虑区域) public stati
  • ASP.NET Web API详解

    千次阅读 2014-02-23 10:52:13
    在这篇文章中我们将讨论Web API设计、概念、功能,和对比Web API与WCF。 1. 实现一个Web API项目 我们从一个简单的实例开始讨论。我们使用Visual Studio 2012做为开发环境。我们第一步是基于Web API模版创建...
  • Javascript缓存API

    2020-10-22 03:18:18
    JavaScript ServiceWorker API的好处就是让WEB开发人员轻松的控制缓存。这篇文章主要为大家详细介绍了Javascript缓存API,感兴趣的小伙伴们可以参考一下
  • Dynamics CRM2016 Web Api之分页查询

    千次阅读 2016-12-01 22:37:16
    在dynamics crm web api还没出现前,我们是通过fetchxml来实现的,当然这种方式依旧可行,那既然web api来了我们就拥抱新的方式。 web api中我们通过指定查询的条数来实现分页的效果,很简单设置http的head即prefer...
  • Webapi之文件上传

    千次阅读 2018-03-21 20:43:45
    Webapi之文件上传 范例说明: 前端:vue.js + element-ui + axios 后端:c# webapi 先上传存储起来,然后再读取文件 仅尝试过在本地调试,未验证服务器 前端部分 使用element-ui的上传组件 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 193,702
精华内容 77,480
关键字:

webapi使用缓存