c#mvc将请求重新路由到不同的服务器

Joh*_*ith 6 .net c# asp.net asp.net-mvc

我有一个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;
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,这有很多问题.如果请求是get,则Content不应设置.标题是不正确的,因为它也复制像主机之类的东西,之后不应该触及等等.

有没有更简单的方法来做这样的事情?

Tyl*_*Y86 1

我必须在 Silverlight 解决方案的 C# 代码中执行此操作一次。这并不漂亮。

您想要的称为反向代理和应用程序请求路由。

首先,反向代理解决方案......它们相对简单。

以下是Scott Forsyth和Carlos Aguilar Mares 的指南,介绍如何在 IIS 下使用 web.config 创建反向代理。如果您不喜欢正常的解决方案,这里有一个名叫 Paul Johnston 的家伙编写的模块。所有这些都集中在 IIS 上。

非 IIS 反向代理更常见于负载平衡。通常它们是基于Apache 的或专有硬件。它们的价格从免费到昂贵不等。原谅俚语。

为了保持客户端视角的一致性,您可能需要的不仅仅是反向代理配置。因此,在采用纯反向代理路线之前……有一些注意事项。

服务器可能需要共享机器密钥来同步视图状态和其他内容,并共享会话存储。

如果这还不够一致,您可能需要通过应用程序请求路由(查找服务器关联性)来实现会话粘性,以便给定的会话 cookie(或 IP 地址,或者可能让它生成令牌 cookie)将用户映射到相同的会话。服务器处理每个请求。