云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

京东云_akamaicdn_三重好礼

小七 141 0

海量数据存储_如何选择_怎么搭建云主机

TL;DR:本文将向您展示如何在C#和.netcore中实现反向代理,以克服使用现成软件很难解决的特定需求。您可以在这个GitHub存储库中找到最终项目的代码。使用反向代理在网络基础设施的各种元素中(如DNS服务器、防火墙、代理等),公众号返利系统,反向代理不仅在IT人员中,而且在开发人员中得到了广泛的应用。这主要是由于微服务体系结构的流行以及技术合作伙伴之间的高级集成需求的增长。什么是反向代理标准代理服务器充当客户端和服务器之间的中介,以便执行缓存、流量监控、资源访问控制等处理。相关的事情是客户端请求联系特定服务器,而代理在评估如何满足此请求后,代表联系目标服务器客户。反向代理是一种特殊类型的代理服务器,它向客户端隐藏目标服务器。客户端向代理服务器请求资源,一元云购下载,代理服务器从另一个服务器检索资源并将其提供给客户端。在这种情况下,客户机不知道资源来自另一个服务器。为什么要使用反向代理反向代理可以在不同的上下文中使用:负载平衡:也许这是反向代理最常见的用法之一。它可以根据特定的算法在一组相同的服务器之间分配请求负载,从而为系统的可伸缩性和可用性提供支持。URL重写:从搜索引擎优化的角度来看,公众号返利系统,拥有有意义的网址是至关重要的。如果你不能改变你的网站的网址,你可以把它们隐藏在一个反向代理后面,这个反向代理会向用户和网络爬虫者公开一个更吸引人的版本。静态内容服务:许多反向代理服务器可以配置为充当web服务器。这允许您在将动态内容请求转发到专用服务器时使用它们来提供静态内容,如HTML页面、JavaScript脚本、图像和其他文件。这是一种基于内容类型的负载平衡。API网关:在具有微服务体系结构的系统中,有多个服务器通过其api提供不同的服务。您可以使用反向代理来公开服务器api组合的单个入口点。多个网站合并:这非常类似于API网关上下文。在这种情况下,您可以为多个网站提供一个单一的入口点,可能有一个集中的主页。为什么要实现自定义反向代理最流行的反向代理之一是NGINX。当然,您可以使用其他工具,如Pound或Squid,也可以配置apacheweb服务器作为反向代理。这些工具提供了许多配置选项,允许您在最常见的情况下设置系统。例如,用lungi语言来扩展它们的脚本功能。此功能允许您满足一些简单服务器配置没有提供的处理需求:HTTP报头操作、条件请求转发、简单内容转换等。但是,您可能会发现,由于场景本身的复杂性或由于脚本变得难以维护,即使是集成脚本语言也不足以满足您的需要。例如,考虑这样一个场景:您需要在当前域中公开一个远程Web应用程序,服务器和云主机,并且需要通过从数据库中注入数据来准备HTTP请求,并操纵响应以将它们集成到当前环境中。或者需要应用复杂的自定义规则来分析HTTP流量的场景。如果您处于这种情况下,您可能需要构建自己的自定义反向代理。在C语言中实现反向代理#实现你自己的反向代理的核心并不像听起来那么难。当然,您不太可能使用NGINX或其他类似工具提供的所有选项创建反向代理。但是,您可以专注于您的特定目标,以便在不依赖于复杂配置和脚本的情况下以最佳方式解决它。在本文的剩余部分中,您将使用C语言构建一个简单的反向代理,它允许您将Google表单集成到您的网站中。该表单不需要认证就可以公开使用,并允许用户注册以接收T恤。当通过反向代理集成到您的Web应用程序中时,它将预先填充当前用户的一些个人数据。当然,Web应用程序的实现将保持简单,以便专注于与反向代理相关的挑战。我们开始编码吧!建立项目您可以使用VisualStudio或通过命令行创建新的.NET核心项目。通过使用visualstudio,可以选择空的ASP.NET核心模板如下图所示:或者,可以通过在控制台窗口中键入以下命令来创建相同的项目模板:dotnet新web-n reverseproxy应用程序您将在几秒钟内看到以下屏幕:无论您的选择如何,您都将获得一个空的ASP.NET应用程序在您指定的文件夹中。添加反向代理中间件回想一下反向代理的定义,您需要拦截一些HTTP请求,并在客户机不知情的情况下将它们重定向到另一个服务器。在.NET核心基础设施中,您可以通过实现中间件来实现这一点。中间件是一个组件,用于拦截HTTP请求和响应,以便在需要时对其进行操作。因此,在项目中添加一个名为Re的新文件VerseProxy中间件.cs包括以下内容://反向氧化应用/ReVerseProxy中间件.cs使用Microsoft.AspNetCore.Http;使用系统;使用系统.Linq;使用系统.Net.Http;使用系统线程化任务;应用程序反向名称空间{公共类ReverseProxy中间件{私有静态只读HttpClient _HttpClient=new HttpClient();私有readonly RequestDelegate\u nextMiddleware;公共ReverseProxy中间件(RequestDelegate nextMiddleware){_nextMiddleware=nextMiddleware;}公共异步任务调用(HttpContext上下文){var targetUri=构建目标URI(上下文。请求);如果(targetUri!=空){var targetRequestMessage=CreateTargetMessage(上下文,targetUri);使用(var responseMessage=await_httpClient.SendAsync(targetRequestMessage,HttpCompletionOption.ResponseHeadersRead, context.RequestAborted已中止)){context.Response.StatusCode=(整数)响应消息.状态代码;CopyFromTargetResponseHeaders(上下文、响应消息);等待responseMessage.Content.CopyToAsync(context.Response.Body);}返回;}wait\u nextMiddleware(上下文);}私有HttpRequestMessage CreateTargetMessage(HttpContext上下文,Uri targetUri){var requestMessage=new HttpRequestMessage();CopyFromOriginalRequestContentAndHeaders(上下文,requestMessage);requestMessage.RequestUri=目标URI;requestMessage.Headers.Host= targetUri主机;requestMessage.Method=获取方法(上下文.请求.方法);返回请求消息;}私有void CopyFromOriginalRequestContentAndHeaders(HttpContext上下文,HttpRequestMessage requestMessage){变量请求方法=上下文.请求.方法;如果(!HttpMethods.IsGet(请求方法)&&!HttpMethods.IsHead(请求方法)&&!HttpMethods.IsDelete(请求方法)&&!HttpMethods.IsTrace(请求方法){var streamContent=新streamContent(context.Request.Body);请求消息。内容=含水量;}foreach(var头输入context.Request.Headers){请求消息。内容?.Headers.TryAddWithoutValidation(未验证)(页眉.键, 标题.Value.ToArray());}}私有void CopyFromTargetResponseHeaders(HttpContext上下文,HttpResponseMessage responseMessage){foreach(var头输入响应消息。标题){context.Response.Headers[页眉.键] = 标题.Value.ToArray();}foreach(var头输入responseMessage.Content.Headers){context.Response.Headers[页眉.键] = 标题.Value.ToArray();}context.Response.Headers.Remove("传输编码");}私有静态HttpMethod GetMethod(string方法){如果(HttpMethods.IsDelete(方法)返回HttpMethod.Delete;如果(HttpMethods.IsGet(方法)返回HttpMethod.获取;如果(HttpMethods.IsHead(方法)返回HTT方法头;如果(HttpMethods.IsOptions(方法)返回HttpMethod.选项;如果(HttpMethods.IsPost(方法)返回HttpMethod.Post;如果(HttpMethods.IsPut输出(方法)返回HttpMethod.Put;如果(HttpMethods.IsTrace(方法)返回HttpMethod.Trace.跟踪;返回新的HttpMethod(method);}私有Uri BuildTargetUri(HttpRequest请求){Uri targetUri=null;如果(request.Path.StartsWithSegments("/googleforms",out var remainingPath){targetUri=新Uri("https://docs.google.com/forms"+剩余路径);}返回targetUri;}}}这里定义了一个具有两个私有属性的reverseProxy中间件类:私有静态只读HttpClient _HttpClient=new HttpClient();私有readonly RequestDelegate\u nextMiddleware;客户端中的任何请求都将由客户端来定义,而客户端中的任何请求都将由客户端来传递ASP.NETHTTP管道。在类构造函数中初始化\u nextMiddleware属性,淘客插件,如下所示:公共ReverseProxy中间件(RequestDelegate nextMiddleware){_nextMiddleware=nextMiddleware;}大部分工作是由Invoke()方法完成的,如下面的代码片段所示:公共异步任务调用(HttpContext上下文){var targetUri=构建目标URI(