【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;pwd=123@abc"
},
"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快……
【AspNet Core】Nuget代理网站的更多相关文章
- AspNet Core 初步认识
Core 的出现对我我没有很大的影响,当时在Core要发布的时候听到周围的人再聊再谈,我没有去太多关注,就是一个屌丝开发人员. 直到又一次偶然见到一位特别喜欢.net的老开发人员谈起Core时落泪了, ...
- AspNet Core Api Restful +Swagger 发布IIS 实现微服务之旅 (二)
上一步我们创建好CoreApi 接下来在框架中加入 Swagger 并发布 到 IIS (1)首先点击依赖项>管理Nuget包 (2)输入 Swashbuckle.aspnetCore 比 ...
- ASP.NET Core下发布网站
一.windows下发布到IIS 1.前奏:IIS上的准备 (1)IIS 必须安装AspNetCoreModule 模块 下载地址:(DotNetCore.2.0.3-WindowsHosting-a ...
- ASP.NET Core下发布网站图解
与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel ...
- AspNet Core Api Restful +Swagger 发布IIS
上一步我们创建好CoreApi 接下来在框架中加入 Swagger 并发布 到 IIS (1)首先点击依赖项>管理Nuget包 (2)输入 Swashbuckle.aspnetCore 比 ...
- AspNet Core使用Mysql一些问题及解决方案
本文假设的你的AspNet Core 2.2的Web程序通过EntityFrameworkCore连接使用MSSQL数据库,能正常使用. 如何想转为使用Mysql,其实不难. 1.安装Mysql这个简 ...
- AspNet Core结合Quartz使用定时任务且通过注入缓存或者配置参数
一.经常在项目会用到定时任务同步数据或更新缓存等操作,在很久以前我们可能经常会用一个多线程或timer来做定时任务,这样能实现比较简单轻量级的任务:对于任务多且都调用频率不一样的任务,我们都会用到Qu ...
- 在 Mac OS 上创建并运行 ASP.NET Core 1.0 网站
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- AspNet Core 下利用普罗米修斯+Grafana构建Metrics和服务器性能的监控 (无心打造文字不喜勿喷谢谢!)
概述 Prometheus的主要特点 组件 结构图 适用场景 不适用场景 安装node_exporter,系统性能指数收集(收集系统性能情况) 下载文件 解压并复制node_exporter应用程序到 ...
随机推荐
- jquery 中jsonp的实现原理
在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,即一般的 ajax是不能进行跨域请求的.但 img.iframe .script等标签是个例外,这些标签可以通过 src属性请求到其 ...
- js 对象合并
//条件 var obj1 = { food: 'pizza', car: 'ford' } var obj2 = { animal: 'dog' } //需求如下 obj1.merge(obj2); ...
- MySQL · 答疑解惑 · MySQL 锁问题最佳实践
http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会 ...
- signalR selfhost 版本兼容问题
一.异常简要说明 最近在学习signalR,i按照http://www.asp.net/signalr/overview/deployment/tutorial-signalr-self-host 这 ...
- Python全栈开发【基础三】
Python全栈开发[基础三] 本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...
- ffmpeg-20161003[04,05.06]-bin.7z
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...
- ecshop不同文章分类调用不同文章分类模板
根据需要,不同的文章分类会有不一样的页面风格.也就是说根据文章分类ID来判断,输出不同的文章分类模板. 重点就是文章分类的ID. 打开:article_cat.php $smarty->disp ...
- 最短路(Floyd)
关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...
- WebSocket介绍和一个简单的聊天室
WebSocket是什么呢? WebSocket一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范, ...
- seo优化urlrewrite伪静态技术
1.下载urlrewrite-3.2.0.jar 2.在WEB-INF下增加urlrewrite.xml <?xml version="1.0" encoding=" ...