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
不应设置。标题是不正确的,因为它也复制东西,如事后不应该触摸主机等。
有没有更简单的方法来做这样的事情?
我不得不在C#代码中执行一次Silverlight解决方案。这并不漂亮。
你想要什么叫做反向代理和应用程序请求路由。
首先,反向代理解决方案......它们相对简单。
这里是Scott Forsyth和Carlos 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添加到您的项目,你是好去。您甚至可以即时修改请求,响应或拒绝由于验证失败而导致的转发。
看看源代码,它的确很容易实现:)
你想要一些负载平衡软件。我不会建议你自己试着在代码中自己做这种事情。获得现成的包装要好得多。 – Liam
@Liam不能这样做。这是一个简化的用例。在现实世界中,幕后有一些认证。 –
负载均衡器或反向代理。这是一个非常标准的设置,大多数COTS产品应该能够处理认证,包括传递令牌或其他任何东西。微软ISA是一个与AD等 – ADyson