电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

.Net反向代理組件Yarp用法詳解

瀏覽:215日期:2022-06-08 17:08:04
目錄
  • 簡介
  • 基礎使用
    • 1、創建 ASP.NET Core 空項目
    • 2、 修改代碼 Program.cs 文件
    • 3、修改配置文件 appsettings.json
    • 4、啟動項目
    • 5、問題整理
  • 進階探索
    • 1、多地址代理
    • 2、規則匹配
    • 3、問題整理
  • 小試牛刀
    • 踩坑集錦
      • 1、non-ASCII

    簡介

    Yarp 是微軟團隊開發的一個反向代理組件, 除了常規的 http 和 https 轉換通訊,它最大的特點是可定制化,很容易根據特定場景開發出需要的定制代理通道。

    詳細介紹:https://devblogs.microsoft.com/dotnet/announcing-yarp-1-0-release

    源碼倉庫:https://github.com/microsoft/reverse-proxy

    文檔地址 :https://microsoft.github.io/reverse-proxy/

    基礎使用

    1、創建 ASP.NET Core 空項目

    使用 Visual Studio :

    使用 .NET CLI 命令行創建:

    dotnet new web -o MyProxy

    2、 修改代碼 Program.cs 文件

    var builder = WebApplication.CreateBuilder(args);builder.Services.AddReverseProxy()    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));var app = builder.Build();app.MapGet("/Ping", () => "Hello World!");app.MapReverseProxy();app.Run();

    3、修改配置文件 appsettings.json

    {  "Logging": {    "LogLevel": {      "Default": "Information",      "Microsoft.AspNetCore": "Warning"    }  },  "AllowedHosts": "*",  "ReverseProxy": {    "Routes": {      "routeAll": {"ClusterId": "clusterBaidu","Match": {  "Path": "{**catch-all}"}      }    },    "Clusters": {      "clusterBaidu": {"Destinations": {  "baidu": {    "Address": "https://www.baidu.com/"  }}      }    }  }}

    這里的配置是將所有的請求都轉發到百度。

    在 Program.cs 里,還注冊了一個 Get 路由 Ping 。

    4、啟動項目

    能夠看到在瀏覽器訪問程序監聽的端口號后,顯示的是百度的頁面。打開 F12 ,看到請求頭也是本地的,并不是百度的域名。

    測試手動注冊的路由 Ping :

    能夠顯示正常。

    5、問題整理

    • (1) Yarp 是不是只能做這種簡單的轉發?

    不是,往下有配置文件說明。

    • (2) JSON 配置文件里有什么要注意的地方嗎?

    有。在這個演示的配置文件中 ReverseProxy:Clusters:cluster1:Destinations:destination1:Address 對應的值是:https://www.baidu.com/ ,如果去掉 www ,在項目啟動后會跳轉到百度首頁,不是代理轉發。去掉末尾的 / 符合沒有任何影響。

    • (3) Yarp 會影響到程序中注冊的路由嗎?

    不會影響到程序內部注冊的路由。在 Program.cs 中無論 app.MapReverseProxy(); 在上還是在下,在訪問 Ping 的時候,都是返回 Hello World!

    var app = builder.Build();app.MapReverseProxy();app.MapGet("/Ping", () => "Hello World!");app.Run();

    進階探索

    1、多地址代理

    修改配置文件 appsettings.json ,實現默認路由跳轉百度,當訪問 /movie 是訪問 b站。

    {  "Logging": {    "LogLevel": {      "Default": "Information",      "Microsoft.AspNetCore": "Warning"    }  },  "AllowedHosts": "*",  "ReverseProxy": {    "Routes": {      "routeBaidu": {"ClusterId": "clusterBaidu","Match": {  "Path": "{**catch-all}"}      },      "routeBiliBili": {"ClusterId": "clusterBiliBili","Match": {  "Path": "/movie/{**catch-all}"}      }    },    "Clusters": {      "clusterBaidu": {"Destinations": {  "baidu": {    "Address": "https://www.baidu.com/"  }}      },      "clusterBiliBili": {"Destinations": {  "bilibili": {    "Address": "https://www.bilibili.com/"  }}      }    }  }}

    測試結果:

    在后面輸入路由 /movie 后能夠跳轉到b站。但是b站網頁沒有完整顯示,圖片都沒有,這是網站上的策略問題,對于數據接口沒有這些問題。

    詳細的配置文件說明,可以查看 https://microsoft.github.io/reverse-proxy/articles/config-files.html

    2、規則匹配

    網頁上太多資源,為了方便測試,啟用兩個 api 接口。地址分別是:http://localhost:5241/ 和 https://localhost:7184/

    兩個 api 接口中分別注冊 /test 路由。

    // http://localhost:5241/app.MapGet("/test", () => "Welcome to Api111!");// https://localhost:7184/app.MapGet("/test", () => "Welcome to Api222!");

    啟動兩個 api 程序。

    C:\Users\Test>curl http://localhost:5241/testWelcome to Api111!C:\Users\Test>curl https://localhost:7184/testWelcome to Api222!

    修改 MyProxy 項目的配置文件 appsettings.json

    {  "Logging": {    "LogLevel": {      "Default": "Information",      "Microsoft.AspNetCore": "Warning"    }  },  "AllowedHosts": "*",  "ReverseProxy": {    "Routes": {      "routeOne": {"ClusterId": "clusterOne","Match": {  "Path": "/test/{**catch-all}",  "QueryParameters": [    {      "Name": "number",      "Values": [ "1" ]    }  ]}      },      "routeTwo": {"ClusterId": "clusterTwo","Match": {  "Path": "/test/{**catch-all}",  "QueryParameters": [    {      "Name": "number",      "Values": [ "2" ]    }  ]}      },      "routeBaidu": {"ClusterId": "clusterBaidu","Match": {  "Path": "{**catch-all}"}      }    },    "Clusters": {      "clusterOne": {"Destinations": {  "apiOne": {    "Address": "http://localhost:5241/"  }}      },      "clusterTwo": {"Destinations": {  "apiTwo": {    "Address": "https://localhost:7184/"  }}      },      "clusterBaidu": {"Destinations": {  "baidu": {    "Address": "https://www.baidu.com/"  }}      }    }  }}
    • Path :監聽路由地址。
    • QueryParameters:匹配參數。
    • QueryParameters:Name:參數名。
    • QueryParameters:Values:參數值。

    MyProxy 的監聽端口是 http://localhost:5024/ 訪問結果如下:

    C:\Users\Test>curl http://localhost:5024/pingHello World!C:\Users\Test>curl http://localhost:5024/test<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL /test was not found on this server.</p></body></html>C:\Users\Test>curl http://localhost:5024/test?number=1Welcome to Api111!C:\Users\Test>curl http://localhost:5024/test?number=2Welcome to Api222!

    能夠根據參數以及參數值導向對應的地址。

    3、問題整理

    • (1)為什么訪問 /movie 不能正常顯示網頁。

    因為 b站某些接口開啟了防盜鏈,還有跨域檢測。

    • (2)在根據參數匹配中,如果匹配的路由一樣,監聽的參數一樣,參數值也一樣會怎么樣?

    訪問該路由地址會報錯。

    • (3)路由匹配的優先級?

    程序內注冊的路由優先級最高,其次才是 Yarp 在配置文件里加載的。

    小試牛刀

    最近的工作是做企業內數據安全方面的。推動公司數據安全體系,通過技術手段提升公司信息安全。

    有一個很老的OA系統,十幾年了, .NET Framework 2.0 寫的。漏洞一大堆,包括不限于xss、sql注入等,權限只到表單級別。瀏覽器上按下 F12 能查看到表單鏈接,直接復制出去,別人也能訪問。

    在這個系統上要做安全,我想的是在中間加代理,正好適合使用 Yarp 來完成,也方便寫業務處理代碼。嗯,很真實, .NET Core 寫的,方便寫業務代碼。

    用戶登錄成功后,會記錄下用戶的 Host 和 Cookie,每次訪問的時候系統的時候,在 Yarp 這里都校驗一下是否與用戶登錄時的匹配。

    解決了兩個問題:

    1、從網絡層捕獲到所有的請求,方便后面做排查。參數、傳值,出了事故可以找到責任人。

    2、隔離真實的站點地址,杜絕弱安全等級網站暴露后被壞人攻擊的風險。

    踩坑集錦

    1、non-ASCII

    項目要代理某網頁,在使用下載功能的時候,接口返回 502 。

    info: Yarp.ReverseProxy.Forwarder.HttpForwarder[48]      ResponseHeaders: The destination returned a response that cannot be proxied back to the client.      System.InvalidOperationException: Invalid non-ASCII or control character in header: 0x00E4 at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.ThrowInvalidHeaderCharacter(Char ch) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.ValidateHeaderValueCharacters(StringValues headerValues) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpResponseHeaders.SetValueFast(String key, StringValues value) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.Microsoft.AspNetCore.Http.IHeaderDictionary.set_Item(String key, StringValues value) at Yarp.ReverseProxy.Forwarder.HttpTransformer.CopyResponseHeaders(HttpHeaders source, IHeaderDictionary destination) at Yarp.ReverseProxy.Forwarder.HttpTransformer.TransformResponseAsync(HttpContext httpContext, HttpResponseMessage proxyResponse) at Yarp.ReverseProxy.Transforms.Builder.StructuredTransformer.TransformResponseAsync(HttpContext httpContext, HttpResponseMessage proxyResponse) at Yarp.ReverseProxy.Forwarder.HttpForwarder.SendAsync(HttpContext context, String destinationPrefix, HttpMessageInvoker httpClient, ForwarderRequestConfig requestConfig, HttpTransformer transformer)

    去 GitHub 翻 Issues

    下載接口能正常訪問,文件流也能完整地拿到。重寫了所有的響應頭沒有用。這種不開源的商業站點,也猜不到字符編碼。

    最后妥協了,用了一個 .NET 服務在服務器上下載后再轉發。

    代理非常規服務接口時,一定要多測試。

    以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對的支持。如果你想了解更多相關內容請查看下面相關鏈接

    標簽: ASP.NET
    相關文章:
    主站蜘蛛池模板: 京港视通报道-质量走进大江南北-京港视通传媒[北京]有限公司 | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 免费个人pos机申请办理-移动pos机刷卡-聚合收款码办理 | 选矿设备,选矿生产线,选矿工艺,选矿技术-昆明昆重矿山机械 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂_帽子厂_浙江高普制帽厂 | 冷凝锅炉_燃气锅炉_工业燃气锅炉改造厂家-北京科诺锅炉 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 顶空进样器-吹扫捕集仪-热脱附仪-二次热解吸仪-北京华盛谱信仪器 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | EPK超声波测厚仪,德国EPK测厚仪维修-上海树信仪器仪表有限公司 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 高压分散机(高压细胞破碎仪)百科-北京天恩瀚拓 | 字典-新华字典-在线字典查字-字典趣| 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 精密机械零件加工_CNC加工_精密加工_数控车床加工_精密机械加工_机械零部件加工厂 | 无纺布包装机|径向缠绕包装机|缠绕膜打包机-上海晏陵智能设备有限公司 | 上海心叶港澳台联考一对一培训_上海心叶港澳台联考,港澳台联考一对一升学指导 | 河南档案架,档案密集架,手动密集架,河南密集架批发/报价 | 橡胶膜片,夹布膜片,橡胶隔膜密封,泵阀设备密封膜片-衡水汉丰橡塑科技公司网站 | 水上浮桥-游艇码头-浮动码头-游船码头-码瑞纳游艇码头工程 | 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 土壤水分自动监测站-SM150便携式土壤水分仪-铭奥仪器 | 泰国试管婴儿_泰国第三代试管婴儿费用|成功率|医院—新生代海外医疗 | 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | 水冷式工业冷水机组_风冷式工业冷水机_水冷螺杆冷冻机组-深圳市普威机械设备有限公司 | 余姚生活网_余姚论坛_余姚市综合门户网站 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 板式换热器_板式换热器价格_管式换热器厂家-青岛康景辉 | 涿州网站建设_网站设计_网站制作_做网站_固安良言多米网络公司 | 冷库安装厂家_杭州冷库_保鲜库建设-浙江克冷制冷设备有限公司 | 高效节能电机_伺服主轴电机_铜转子电机_交流感应伺服电机_图片_型号_江苏智马科技有限公司 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 油冷式_微型_TDY电动滚筒_外装_外置式电动滚筒厂家-淄博秉泓机械有限公司 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 铝箔袋,铝箔袋厂家,东莞铝箔袋,防静电铝箔袋,防静电屏蔽袋,防静电真空袋,真空袋-东莞铭晋让您的产品与众不同 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 济南网站策划设计_自适应网站制作_H5企业网站搭建_济南外贸网站制作公司_锐尚 |