C# Web 应用程序 -> 代理所有请求 -> 从另一个 Web 应用程序返回内容(反向代理)
Posted
技术标签:
【中文标题】C# Web 应用程序 -> 代理所有请求 -> 从另一个 Web 应用程序返回内容(反向代理)【英文标题】:C# web application -> proxy all requests -> return content from another web application (Reverse proxy) 【发布时间】:2018-07-03 14:50:09 【问题描述】:我想将每个请求代理到 Web 应用程序,将其传递给另一个 Web 应用程序,然后将我的其他 Web 应用程序响应返回给原始发件人。
它应该能够处理所有http methods
和content-types
等。我还应该能够编辑传入的请求并添加额外的标头和内容。
这样做的背景是一个项目的安全架构,该项目在公共 DMZ 中有一个 Web 服务器,然后在内部网络中有另一个 Web 服务器允许与数据库服务器通信。
为 ASP.NET 核心找到了一个线程,但最好使用 .Net Framework 完成,而不是依赖于外部库。
Creating a proxy to another web api with Asp.net core
【问题讨论】:
你有什么问题?如果您只想逐字传递请求和响应,您不需要另一个应用程序,只需一个通用网关服务器,我会想到。如果需要,这些工具可能会添加奇怪的额外标题等。 @ADyson 我需要能够为请求添加额外的标头和内容,请参阅第二段。 是的,我相信一些网关软件可以做到这一点。但同样,您的问题是什么?另外,为什么您需要传递请求?这个“客户端门户”是 API 还是 GUI?它听起来像一个图形用户界面。所以用户向 GUI 发出请求,GUI 向 API 发出请求……听起来很标准? @ADyson 如果问题问得不好,我很抱歉。我自己找到了答案,但请求通过的原因是因为我需要为每个请求添加证书。这无法在 GUI 中处理,因为这样客户端就可以访问此证书。 "这不能在 GUI 中处理,因为这样客户端就可以访问这个证书。"如果 GUI 的后端(即服务器端代码)正在发出请求,则不会。无论如何,很高兴您找到了解决方案。 【参考方案1】:为 Web API 找到了一个很好的答案,让我朝着正确的方向前进。
https://***.com/a/41680404/3850405
我首先添加了一个新的 ASP.NET Web 应用程序 -> MVC -> 无身份验证。
然后我删除了所有接受Global.asax
、packages.config
和Web.config
。
然后我编辑了Global.asax
以使用DelegatingHandler
,如下所示:
public class MvcApplication : System.Web.HttpApplication
protected void Application_Start()
GlobalConfiguration.Configure(CustomHttpProxy.Register);
public static class CustomHttpProxy
public static void Register(HttpConfiguration config)
config.Routes.MapHttpRoute(
name: "Proxy",
routeTemplate: "*path",
handler: HttpClientFactory.CreatePipeline(
innerHandler: new HttpClientHandler(),
handlers: new DelegatingHandler[]
new ProxyHandler()
),
defaults: new path = RouteParameter.Optional ,
constraints: null
);
public class ProxyHandler : DelegatingHandler
private static HttpClient client = new HttpClient();
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
var forwardUri = new UriBuilder(request.RequestUri.AbsoluteUri);
forwardUri.Host = "localhost";
forwardUri.Port = 62904;
request.RequestUri = forwardUri.Uri;
if (request.Method == HttpMethod.Get)
request.Content = null;
request.Headers.Add("X-Forwarded-Host", request.Headers.Host);
request.Headers.Host = "localhost:62904";
var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
return response;
在此之后,我必须添加静态内容,然后一切正常。
【讨论】:
感谢您的回答 - 非常有帮助!不过,我不得不 Nuget 这个包:Microsoft.AspNet.WebApi.WebHost以上是关于C# Web 应用程序 -> 代理所有请求 -> 从另一个 Web 应用程序返回内容(反向代理)的主要内容,如果未能解决你的问题,请参考以下文章