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

问题描述:

我有一个Web应用程序,它是几个不同服务器的网格,1服务器是处理所有请求外部传入请求的前端服务器。c#mvc重新路由请求到不同的服务器

因此,这些请求中的一部分将不得不传递给不同的服务器,理想情况下,我想要更改的唯一内容就是这些请求的主机和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不应设置。标题是不正确的,因为它也复制东西,如事后不应该触摸主机等。

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

+3

你想要一些负载平衡软件。我不会建议你自己试着在代码中自己做这种事情。获得现成的包装要好得多。 – Liam

+0

@Liam不能这样做。这是一个简化的用例。在现实世界中,幕后有一些认证。 –

+1

负载均衡器或反向代理。这是一个非常标准的设置,大多数COTS产品应该能够处理认证,包括传递令牌或其他任何东西。微软ISA是一个与AD等 – ADyson

我不得不在C#代码中执行一次Silverlight解决方案。这并不漂亮。

你想要什么叫做反向代理应用程序请求路由

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

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

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

为了保持客户端视角的一致性,您可能需要的不仅仅是逆向代理配置。所以,在你走下纯粹的反向代理路由之前,有一些考虑因素。

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

如果这不够一致,您可能需要通过Application Request Routing(查找服务器相关性)实施会话粘性,以便给定的会话cookie(或IP地址,或者可能会生成令牌cookie)将用户映射到每个请求都使用同一台服务器。

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

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

刚刚通过的NuGet添加到您的项目,你是好去。您甚至可以即时修改请求,响应或拒绝由于验证失败而导致的转发。

看看源代码,它的确很容易实现:)