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

时间:2016-09-23 09:53:12

标签: c# asp.net .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;
}

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

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

2 个答案:

答案 0 :(得分:2)

我必须在C#代码中执行一次Silverlight解决方案。它不漂亮。

您想要的是反向代理应用程序请求路由

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

这里有Scott ForsythCarlos Aguilar Mares指南,用于在IIS下使用web.config创建反向代理。 如果你不喜欢正常的解决方案,这里有一些名叫保罗约翰斯顿的家伙a module。所有这些都集中在IIS上。

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

为了保持客户端视角的一致性,您可能需要的不仅仅是反向代理配置。所以在你走下纯反向代理路线之前......还有一些注意事项。

服务器可能需要共享Machine Keys来同步视图状态和其他内容,并共享Session Store

如果这不够一致,您可能希望通过Application Request Routing(查找服务器关联性)实现会话粘性,以便给定的会话cookie(或IP地址,或者可能让它生成令牌cookie)在每次请求时将用户映射到同一服务器。

答案 1 :(得分:0)

我还为asp.net / web api编写了一个简单但功能强大的反向代理。它完全符合您的需求。

你可以在这里找到它: https://github.com/SharpTools/SharpReverseProxy

只需通过nuget添加到您的项目中就可以了。您甚至可以动态修改请求,响应或由于身份验证失败而拒绝转发。

看看源代码,它实现起来非常简单:)