我有一个 web 应用程序,它是几个不同服务器的网格,其中 1 个服务器是处理所有外部传入请求的前端服务器。
因此,其中一些请求必须传递到不同的服务器,理想情况下,我唯一想更改的是这些请求的主机和 Uri 字段。有没有一种方法可以将整个传入请求映射到新的传出请求并仅更改几个字段?
我试过这样的:
// some controller
public HttpResponseMessage get()
{
return this.Request.Rewrite("192.168.10.13/api/action");
}
//extension method Rewrite
public static HttpResponseMessage Rewrite(this HttpRequestMessage requestIn, string Uri) {
HttpClient httpClient = new HttpClient(new HttpClientHandler());
HttpRequestMessage requestOut = new HttpRequestMessage(requestIn.Method, Uri);
requestOut.Content = requestIn.Content;
var headerCollection = requestIn.Headers.ToDictionary(x => x.Key, y => y.Value);
foreach (var i in headerCollection)
{
requestOut.Headers.Add(i.Key, i.Value);
}
return httpClient.SendAsync(requestOut).Result;
}
我遇到的问题是这有一大堆问题。如果请求是获取 Content
,则不应设置。 header 不正确,因为它还复制了诸如主机之类的东西,这些东西之后不应该被触及等。
有没有更简单的方法来做这样的事情?
最佳答案
我不得不在 C# 代码中为 Silverlight 解决方案执行一次此操作。它不漂亮。
您想要的是反向代理和应用程序请求路由。
首先,反向代理解决方案......它们相对简单。
这是 Scott Forsyth和 Carlos Aguilar Mares在 IIS 下使用 web.config 创建反向代理的指南。 这是 a module如果您不喜欢正常的解决方案,一些名叫 Paul Johnston 的家伙写道。所有这些都集中在 IIS 上。
非 IIS 反向代理更常用于负载平衡。通常它们是 Apache基于或专有硬件。它们从免费到昂贵不等。 请原谅这个俚语。
为了保持客户端视角的一致性,您可能需要的不仅仅是反向代理配置。因此,在您走纯反向代理路线之前...有一些注意事项。
服务器可能需要共享 Machine Keys同步 View 状态和其他内容,并共享 Session Store也是。
如果这不够一致,您可能希望通过 Application Request Routing 实现 session 粘性(寻找服务器亲和性),这样给定的 session cookie(或 IP 地址,或者可能让它生成 token cookie)在每次请求时将用户映射到同一服务器。
关于c# mvc 将请求重新路由到不同的服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39657836/