【AspNet Core】Nuget代理网站

因为访问Nuget太慢,在Dotnet Core RC2发布前,我就基于Asp.Net做了一个Nuget代理网站

这是网站地址:http://nuget.lzzy.net/

Nuget源:http://nuget.lzzy.net/api/v2

广西电信百兆带宽。

这个网站将会缓存所有访问过的API页面与包。

API页面缓存的原理,第一次访问会等待服务器从Nuget上下载页面信息

下载后会替换里面的网址并保存到数据库。

第二次访问会从数据库里取出页面兵判断过期时间

如果已过期,先返回页面信息,后台新建线程下载新页面。

这样国内访问的时候就会觉得非常快。

升级至AspNet Core

等到RC2发布后,我觉得,是时候研究Dotnet Core平台了

那么就从这个小小的Nuget代理网站开始吧。

在.Net FX下,开发的代理程序是通过IHttpHandler进行代理的

那么到了AspNet Core,就变成了通过中间件进行代理。

路由在AspNetCore下也变得不同了,使用起来比老版的更方便更简单。

路由的使用

注:路由的使用需要用到包Microsoft.AspNetCore.Routing

首先创建一个静态类,添加一个UseXXXMiddleware扩展方法,这是AspNetCore使用中间件的约定,当然你也可以起其它名字。

在方法里,我们需要new一个RouteBuilder实例。

在实例里调用各种映射方法。

然后调用RouteBuilder的Build方法,这将生成一个路由。

最后再使用路由中间件的扩展方法UseRouter,把刚刚Build出来的路由作为参数传递进去即可。

        public static IApplicationBuilder UseNugetProxyMiddleware(this IApplicationBuilder builder, IConfigurationRoot config)
        {
            if (!Directory.Exists("Packages"))
                Directory.CreateDirectory("Packages");

            var cacheSection = config.GetSection("Cache");
            _CacheMetadata = int.Parse(cacheSection.GetSection("Metadata").Value);
            _CacheList = int.Parse(cacheSection.GetSection("List").Value);
            _CacheDetail = int.Parse(cacheSection.GetSection("Detail").Value);
            _CacheDefault = int.Parse(cacheSection.GetSection("Default").Value);
            var proxySection = config.GetSection("Proxy");
            _Source = proxySection.GetSection("Source").Value;
            _Replace = proxySection.GetSection("Replace").Value;
            _Path = proxySection.GetSection("Path").Value;

            var routeBuilder = new RouteBuilder(builder);
            routeBuilder.MapGet(_Path + "/{action}", PageHandler);
            routeBuilder.MapGet(_Path, PageHandler);
            routeBuilder.MapGet(_Path + "/package/{id}/{version}", PackageHandler);

            _Path = "/" + _Path;

            var router = routeBuilder.Build();
            return builder.UseRouter(router);
        }

        private static async Task PageHandler(HttpContext httpContext)
        {

        }

路由下的中间件使用

使用RouteBuilder的映射方法时,需要传递处理HttpContext的委托

这里其实与AspNet Core本身的中间件方法其实是一样的。

只不过,我们需要在方法里获取各种数据,而不是像AspNet Core中间件一样可以在构造函数里获取到一些服务。

AspNet Core路由提供了HttpContext获取路由参数的扩展方法GetRouteValue。

        private static async Task PackageHandler(HttpContext httpContext)
        {

            string id = httpContext.GetRouteValue("id") as string;
            string version = httpContext.GetRouteValue("version") as string;
        }

也有GetRouteData扩展方法,这里我们并不需要用到。

EntityFramework Core

RC2下,EntityFramework Core的使用出现了一些变化

在Startup.cs里,配置EF Core

        public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddDbContext<DataContext>(builder =>
            {
                builder.UseSqlServer(Configuration.GetConnectionString("DataContext"));
            });
        }

在这里修改DbContext的配置。

要注意的是,继承DbContext的类,要使用带参数的构造函数并调用基类构造函数。

    public class DataContext : DbContext
    {
        public DataContext(DbContextOptions<DataContext> options) : base(options) { }

        public DbSet<Page> Page { get; set; }
    }

互斥锁

多人访问同一个新页面,只能有一个人去下载新页面的数据,其他人则等待。新包同理。

多人访问同一个过期页面,只会创建一个新线程去下载新页面的数据。

项目里封装了一个SynchronizationHelp类,在中间件里通过路径进行互斥处理。

剩下的也没什么特别值得要说的了,一些尽在源码里。

Github

这里是这个代理网站的Github:

https://github.com/Kation/NugetProxy

啊,对了,还有一点。

代理网站的配置。

配置文件:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "ConnectionStrings": {
    "DataContext": "server=(local);database=nuget;uid=sa;[email protected]"
  },
  "Cache": {
    "Metadata": "10080",
    "List": "60",
    "Detail": "1440",
    "Default": "30"
  },
  "Proxy": {
    "Source": "https://www.nuget.org/api/v2",
    "Replace": "https://www.nuget.org/api/v2",
    "Path": "api/v2"
  }
}

可以设定缓存时间,超出时间后才去下载新页面,单位是分钟。

Proxy的Source是Nuget源

Replace是要替换的字符串,将会替换为当前网站地址+Path

PS:我在美国架了一台20M的VPS反向代理Nuget

http://nuget.lzzy.net/api/v2使用的是我的VPS方向代理的源

效果比直接访问Nuget快……

时间: 2024-10-25 23:27:42

【AspNet Core】Nuget代理网站的相关文章

AspNet Core 2.2使用Mysql一些问题及解决方案

本文假设的你的AspNet Core 2.2的Web程序通过EntityFrameworkCore连接使用MSSQL数据库,能正常使用. 如何想转为使用Mysql,其实不难. 1.安装Mysql这个简单,从官网https://www.mysql.com/downloads/可以直接下载,无需注册网站.个人使用只需要Community社区版即可.如果下载的是zip压缩版,解压到相应位置.添加my.ini到mysql安装目标,网上可以很容易搜索找到.命令行模式进入安装目录下的bin内:(1)运行my

aspnet core 2.1中使用jwt从原理到精通一

目录 原理: 根据原理使用C#语言,生成jwt: 自定义验证jwt: 使用aspnetcore 中自带的类生成jwt: 学有所得 了解jwt原理; 使用C#轻松实现jwt生成和验证 原理 jwt对所有语言都是通用的,只要知道秘钥,另一一种语言有可以对jwt的有效性进行判断; jwt的组成:Header部分Base64转化.Payload部分Base64转化.使用HS256方式根据秘钥对前面两部分进行加密后再Base64转化,其中使用的hs256加密是header部分指定的,也可以通过官网的查看,

自己搭建 Google 反向代理网站

自己搭建 Google 反向代理网站 1 mantouge · 133 天前 · 2649 次点击 这是一个创建于 133 天前的主题,其中的信息可能已经有所发展或是发生改变. 上次发布了一篇 建了一个 Google 反代,会有什么后果? http://v2ex.com/t/201854然后发现很多童鞋对怎么搭建反向代理服务器很感兴趣,这里就贴出来了,3KU 们! 假设你有一台可以访问Google服务的的服务器(VPS) 假设你有一个域名,并已经解析到服务器IP 假设你有SSL域名证书 假设你使

去哪儿网代理网站机票价格采集方案

原文作者:西安鲲之鹏 原文链接:http://http://www.site-digger.com/html/articles/20120509/33.html 去哪儿网的代理网站有自己独立的机票搜索接口,例如http://xyx.trade.qunar.com/site/. 搜索结果使用Ajax动态加载,服务端返回的数据是JSON格式的. 难点在于返回的价格数据是加密的,返回价格与真实的价格之间有很大的偏差.在客户端使用JS进行解密,显示到页面的价格是正确的.由于解密算法非常复杂,实现难度很大

用代理IP进行简单的爬虫——爬高匿代理网站

用西刺代理网站的IP爬高匿代理网站 1 import re 2 import _thread 3 from time import sleep,ctime 4 from urllib.request import urlopen 5 from urllib.request import Request 6 from urllib.request import ProxyHandler 7 from urllib.request import build_opener 8 from lxml im

ASP.NET CORE做的网站运行在docker上(不用dockerfile文件部署)

原文:ASP.NET CORE做的网站运行在docker上(不用dockerfile文件部署) 按网上的做法用dockerfile文件是可以弄得出来的,http://www.docker.org.cn/article/119.html, 不过我想把网站文件放在外面硬盘目录,再映射进去,这样只要在硬盘目录中修改CSHTML文件后重启一下容器就行了 步骤如下: 1. vs中建立ASP.NET CORE网站,类名为coreweb1 2. 发布到c:\temp\coreweb1目录 3. 先在本地CMD

ASPNET CORE 的 DI 依赖注入 及 AuotoFac 的引入

学习有关Aspnet Core 的DI及IOC等,参考: 1.全面理解 ASP.NET Core 依赖注入    https://blog.csdn.net/hiliqi/article/details/80611209 提及 AuotoFac 的引入Aspnet Core的方式: 把Startup类里面的 ConfigureService的 返回值从 void改为 IServiceProvider即可. public IServiceProvider ConfigureServices(   

ASP.NET Core搭建多层网站架构【8.2-使用Castle.Core实现动态代理拦截器】

2020/01/30, ASP.NET Core 3.1, VS2019, 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[8.2-使用Castle.Core实现动态代理拦截器] 使用Autofac替换原生的依赖注入 文章目录 此分支项目代码 本章节介绍了使用Autofac代替原生的依赖注入,使用Autofac为的是后面配合Castle.Core做AOP动态代理 原文地址:https://www.cnblogs.com/kasnti/p/12244544.html

ASP.NET Core搭建多层网站架构【1-项目结构分层建立】

2020/01/26, ASP.NET Core 3.1, VS2019 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[1-项目结构分层建立] 文章目录 此分支项目代码 此章节介绍了本项目的分层结构,建立了各层级的类库,修改网站项目的启动配置 新建解决方案 新建空白解决方案MSDemo 建立以下解决方案文件夹: 一个解决方案文件夹相当于一个层级,解决方案下是src和tests.而src下分了七个层级,并且每个层级向上依赖,不会出现2.WebCore中的内容依赖5.